Commit d0393ced authored by wangxuewei's avatar wangxuewei

[提交人]:王雪伟

[提交简述] :幸运农场
[实现方案] :1.0.7更换广告依赖方式,加入预加载
parent dfdc0077
......@@ -56,5 +56,10 @@
<option name="name" value="maven5" />
<option name="url" value="http://test.vlion.cn:8081/nexus/content/repositories/inland/" />
</remote-repository>
<remote-repository>
<option name="id" value="maven3" />
<option name="name" value="maven3" />
<option name="url" value="http://zx-maven.huolea.com/repository/admodule/" />
</remote-repository>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="JDK" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
......
......@@ -10,29 +10,23 @@ import com.bytedance.sdk.openadsdk.TTSplashAd
import com.gyf.immersionbar.BarHide
import com.gyf.immersionbar.ImmersionBar
import com.umeng.analytics.MobclickAgent
import com.ym.admodule.rs.RSADUtils
import com.ym.admodule.config.AdManager
import com.ym.admodule.listener.ZXADSplashListener
import com.ym.game.GameActivity
import com.ym.xync.R
import com.ym.library.Constant
import com.ym.library.module.ReportEntity
import com.ym.library.net.SplashPresenter.Companion.PERMISSIONS
import com.ym.game.utils.CenterDialog
import com.ym.library.config.AdManager
import com.ym.library.config.ZXADCallback
import com.ym.library.config.ZXADRewardVideo
import com.ym.library.listener.ZXADSplashListener
import com.ym.library.listener.ZXADVideoListener
import com.ym.library.module.NewsEntity
import com.ym.library.net.*
import com.ym.library.sm.SMADUtils
import com.ym.library.utils.*
import com.ym.library.wechat.UserApiClient
import org.jetbrains.anko.act
class SplashActivity : BaseActivity(), SplashContract.View {
override fun layoutID(): Int = R.layout.splash_layout
private var mPresenter: SplashPresenter? = null
private var tv_skipview: TextView? = null
private var splash_container: FrameLayout? = null
......@@ -95,7 +89,6 @@ class SplashActivity : BaseActivity(), SplashContract.View {
// })
// var newsEntity2 = NewsEntity()
// newsEntity2.codeId = "e95e6a55551"
// SMADUtils.loadSplashAd(newsEntity2,this,splash_container!!,object :ZXADSplashListener{
......@@ -109,53 +102,68 @@ class SplashActivity : BaseActivity(), SplashContract.View {
// }
//
// })
AdManager.loadSplashAd(this,
ADConfig.AD_SPLASH, tv_skipview, splash_container!!, object : ZXADSplashListener {
override fun onSuccessResult() {
Log.e("huang", "onSuccessResult()")
}
override fun onFailResult(result: String) {
Log.e("huang", "onFailResult()")
startMain()
}
override fun onTimeout() {
Log.e("huang", "onTimeout()")
startMain()
}
override fun onErrorResult(s: String) {
Log.e("huang", "onErrorResult()")
startMain()
}
override fun onSplashAdLoad(ad: TTSplashAd) {
Log.e(
"huang",
"广告展现 结束" + System.currentTimeMillis()
)
}
override fun onAdClicked(data: NewsEntity) {
Log.e("huang", "onAdClicked()")
}
override fun onAdShow(data: NewsEntity) {
Log.e("huang", "onAdShow()")
AdManager.loadSplashAd(
this, ADConfig.AD_SPLASH,
tv_skipview,
splash_container!!,
object : ZXADSplashListener {
override fun onAdShow() {
}
override fun onAdSkip() {
Log.e("huang", "onAdSkip()")
startMain()
}
override fun onAdTimeOver() {
Log.e("huang", "onAdTimeOver()")
override fun onError(errorMsg: String?) {
startMain()
}
})
// AdManager.loadSplashAd(this,
// ADConfig.AD_SPLASH, tv_skipview, splash_container!!, object : ZXADSplashListener {
// override fun onSuccessResult() {
// Log.e("huang", "onSuccessResult()")
// }
//
// override fun onFailResult(result: String) {
// Log.e("huang", "onFailResult()")
// startMain()
// }
//
// override fun onTimeout() {
// Log.e("huang", "onTimeout()")
// startMain()
// }
//
// override fun onErrorResult(s: String) {
// Log.e("huang", "onErrorResult()")
// startMain()
// }
//
// override fun onSplashAdLoad(ad: TTSplashAd) {
// Log.e(
// "huang",
// "广告展现 结束" + System.currentTimeMillis()
// )
// }
//
// override fun onAdClicked(data: NewsEntity) {
// Log.e("huang", "onAdClicked()")
// }
//
// override fun onAdShow(data: NewsEntity) {
// Log.e("huang", "onAdShow()")
// }
//
// override fun onAdSkip() {
// Log.e("huang", "onAdSkip()")
// startMain()
// }
//
// override fun onAdTimeOver() {
// Log.e("huang", "onAdTimeOver()")
// startMain()
// }
// })
} else {
startMain()
}
......@@ -173,7 +181,7 @@ class SplashActivity : BaseActivity(), SplashContract.View {
isClick = false
startTime = System.currentTimeMillis()
// startActivity(Intent(this@SplashActivity, GameActivity::class.java))
val token = SettingPreference.getToken()
val token = com.ym.modulecommon.utils.SettingPreference.getToken()
if (token.isEmpty()) {
EventUtils.onEvent("login_token_null", "未登录")
startActivity(Intent(this@SplashActivity, WxLoginActivity::class.java))
......
package com.ym.game.application;
import android.app.Application
import android.content.Context
import android.content.pm.PackageManager
import android.os.Build
import android.os.Process
import android.text.TextUtils
import android.util.Log
import android.webkit.WebView
import androidx.multidex.MultiDex
import androidx.multidex.MultiDexApplication
import com.bx.adsdk.AdSdk
import com.tencent.bugly.crashreport.CrashReport
import com.umeng.commonsdk.UMConfigure
import com.umeng.socialize.PlatformConfig
import com.ym.admodule.config.AdManager
import com.ym.library.AppliContext
import com.ym.library.Config
import com.ym.library.Constant
import com.ym.library.config.AdManager
import com.ym.library.config.ZXADConfig
import com.ym.library.net.NetConfig
import com.ym.modulecommon.net.NetConfig
import java.io.BufferedReader
import java.io.FileReader
import java.io.IOException
......@@ -32,10 +27,10 @@ class BaseApplication : MultiDexApplication() {
//第一步初始化 application
AppliContext.init(this)
// Config.init(this)
NetConfig.setBase_Url(NetConfig.Environment.PRODUCT)// TODO 上线之后提成成 NetConfig.Environment.PRODUCT
Constant.appLs = "a03d5320d905cf3b"//applsq
AdManager.init(this)
NetConfig.setBase_Url(NetConfig.Environment.DEV)// TODO 上线之后提成成 NetConfig.Environment.PRODUCT
AdManager.init(this,"a03d5320d905cf3b")
// Constant.appLs = "a03d5320d905cf3b"//applsq
// AdManager.init(this)
// AdManager.init(//替换id
// this, ZXADConfig
// .csjId("5113760")
......
......@@ -2,9 +2,8 @@ package com.ym.game.net
import android.text.TextUtils
import com.ym.library.Constant
import com.ym.library.net.NetConfig
import com.ym.library.utils.PhoneUtils
import com.ym.library.utils.SettingPreference
import com.ym.modulecommon.net.NetConfig
import com.ym.modulecommon.utils.PhoneUtils
import okhttp3.Interceptor
import okhttp3.Request
import okhttp3.logging.HttpLoggingInterceptor
......@@ -35,12 +34,12 @@ object GameApiClient {
private val headInterceptor = Interceptor { chain ->
val request = chain.request()
val builder = request.newBuilder()
builder.addHeader(Constant.aid, SettingPreference.getAndroidId())
builder.addHeader(Constant.Device.env, Constant.Param.env)
if (!TextUtils.isEmpty(SettingPreference.getUserAgent())) {
builder.addHeader("web-user-agent", SettingPreference.getUserAgent())
builder.addHeader(Constant.aid, com.ym.modulecommon.utils.SettingPreference.getAndroidId())
builder.addHeader(Constant.Device.env, com.ym.modulecommon.Constant.param.env)
if (!TextUtils.isEmpty(com.ym.modulecommon.utils.SettingPreference.getUserAgent())) {
builder.addHeader("web-user-agent", com.ym.modulecommon.utils.SettingPreference.getUserAgent())
builder.removeHeader("User-Agent")
builder.addHeader("User-Agent", SettingPreference.getUserAgent())
builder.addHeader("User-Agent", com.ym.modulecommon.utils.SettingPreference.getUserAgent())
}
val headers: Request = builder.build()
chain.proceed(headers)
......
......@@ -14,18 +14,18 @@ import android.widget.TextView
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.bytedance.sdk.openadsdk.TTNativeExpressAd
import com.ym.admodule.config.AdManager
import com.ym.game.adapter.GameOrderListAdapter
import com.ym.game.listener.IDialogViewCloseCallback
import com.ym.game.module.FlyBoxEntity
import com.ym.game.module.OrderListEntity
import com.ym.game.module.TurntableEntity
import com.ym.library.AppliContext
import com.ym.library.config.AdManager
import com.ym.library.config.ZXADSizeConfig
import com.ym.library.listener.ZXADExpressListener
import com.ym.library.module.NewsEntity
import com.ym.library.utils.ADConfig
import com.ym.library.utils.PhoneUtils
import com.ym.modulecommon.utils.PhoneUtils
import com.ym.library.utils.Utils
import com.ym.xync.R
import java.text.DecimalFormat
......@@ -140,58 +140,69 @@ object MainDialog {
AdManager.loadFeedAd(
ADConfig.AD_IMG_FADE,
(context),
ZXADSizeConfig(
Utils.px2dip(PhoneUtils.getScreenWidth(context).toFloat()) - 56,
((Utils.px2dip(PhoneUtils.getScreenWidth(context).toFloat()) - 56) * 0.66).toInt()
com.ym.admodule.config.ZXADSizeConfig(
Utils.px2dip(com.ym.library.utils.PhoneUtils.getScreenWidth(context).toFloat()) - 56,
((Utils.px2dip(
com.ym.library.utils.PhoneUtils.getScreenWidth(context).toFloat()
) - 56) * 0.66).toInt()
),
object :
ZXADExpressListener {
override fun onError(p1: String?) {
}
override fun onNativeExpressAdLoad(p0: MutableList<TTNativeExpressAd>?) {
}
override fun onAdClicked(newsEntity: NewsEntity) {
}
override fun onAdShow(newsEntity: NewsEntity) {
}
override fun onRenderFail(s: String) {
}
override fun onRenderSuccess() {
}
override fun onDownloadFinished() {
}
override fun onInstalled() {
}
override fun onDownloadFailed() {
}
override fun onDownloadPaused() {
}
override fun onDownloadActive() {
}
override fun onIdle() {
}
override fun onFail() {
}
override fun onSuccess() {
}
},
layoutAd
)
// AdManager.loadFeedAd(
// ADConfig.AD_IMG_FADE,
// (context),
// ZXADSizeConfig(
// Utils.px2dip(PhoneUtils.getScreenWidth(context).toFloat()) - 56,
// ((Utils.px2dip(PhoneUtils.getScreenWidth(context).toFloat()) - 56) * 0.66).toInt()
// ),
// object :
// ZXADExpressListener {
// override fun onError(p1: String?) {
//
// }
//
// override fun onNativeExpressAdLoad(p0: MutableList<TTNativeExpressAd>?) {
// }
//
// override fun onAdClicked(newsEntity: NewsEntity) {
// }
//
// override fun onAdShow(newsEntity: NewsEntity) {
// }
//
// override fun onRenderFail(s: String) {
// }
//
// override fun onRenderSuccess() {
// }
//
// override fun onDownloadFinished() {
// }
//
// override fun onInstalled() {
// }
//
// override fun onDownloadFailed() {
// }
//
// override fun onDownloadPaused() {
// }
//
// override fun onDownloadActive() {
// }
//
// override fun onIdle() {
// }
//
// override fun onFail() {
// }
//
// override fun onSuccess() {
// }
//
// },
// layoutAd
// )
mDialogView.findViewById<TextView>(R.id.btn_get_drop_happy_accept).setOnClickListener {
mDialog.dismiss()
......@@ -362,62 +373,72 @@ object MainDialog {
// myAdLayParam.width = PhoneUtils.getScreenWidth(context) - Utils.dip2px(30)
// myAdLayParam.height = (PhoneUtils.getScreenWidth(context) * 0.66f).toInt()
// layoutAd.layoutParams = myAdLayParam
AdManager.loadFeedAd(
ADConfig.AD_IMG_FADE,
(context as Activity),
ZXADSizeConfig(
Utils.px2dip(PhoneUtils.getScreenWidth(context).toFloat()) - 30,
((Utils.px2dip(PhoneUtils.getScreenWidth(context).toFloat()) - 30) * 0.66).toInt()
(context),
com.ym.admodule.config.ZXADSizeConfig(
Utils.px2dip(com.ym.library.utils.PhoneUtils.getScreenWidth(context).toFloat()) - 30,
((Utils.px2dip(
com.ym.library.utils.PhoneUtils.getScreenWidth(context).toFloat()
) - 30) * 0.66).toInt()
),
object :
ZXADExpressListener {
override fun onError(p1: String?) {
}
override fun onNativeExpressAdLoad(p0: MutableList<TTNativeExpressAd>?) {
}
override fun onAdClicked(newsEntity: NewsEntity) {
}
override fun onAdShow(newsEntity: NewsEntity) {
}
override fun onRenderFail(s: String) {
}
override fun onRenderSuccess() {
}
override fun onDownloadFinished() {
}
override fun onInstalled() {
}
override fun onDownloadFailed() {
}
override fun onDownloadPaused() {
}
override fun onDownloadActive() {
}
override fun onIdle() {
}
override fun onFail() {
}
override fun onSuccess() {
}
},
layoutAd
)
// AdManager.loadFeedAd(
// ADConfig.AD_IMG_FADE,
// (context as Activity),
// ZXADSizeConfig(
// Utils.px2dip(PhoneUtils.getScreenWidth(context).toFloat()) - 30,
// ((Utils.px2dip(PhoneUtils.getScreenWidth(context).toFloat()) - 30) * 0.66).toInt()
// ),
// object :
// ZXADExpressListener {
// override fun onError(p1: String?) {
//
// }
//
// override fun onNativeExpressAdLoad(p0: MutableList<TTNativeExpressAd>?) {
// }
//
// override fun onAdClicked(newsEntity: NewsEntity) {
// }
//
// override fun onAdShow(newsEntity: NewsEntity) {
// }
//
// override fun onRenderFail(s: String) {
// }
//
// override fun onRenderSuccess() {
// }
//
// override fun onDownloadFinished() {
// }
//
// override fun onInstalled() {
// }
//
// override fun onDownloadFailed() {
// }
//
// override fun onDownloadPaused() {
// }
//
// override fun onDownloadActive() {
// }
//
// override fun onIdle() {
// }
//
// override fun onFail() {
// }
//
// override fun onSuccess() {
// }
//
// },
// layoutAd
// )
mDialog.setCanceledOnTouchOutside(false)
mDialog.setCancelable(false)
......
......@@ -12,6 +12,8 @@ import android.widget.RelativeLayout
import android.widget.TextView
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.ym.admodule.config.AdManager
import com.ym.admodule.listener.ZXADVideoListener
import com.ym.cms.listener.OnRecycleItemClickListener
import com.ym.game.listener.IDialogViewCloseCallback
import com.ym.game.adapter.SigninDropsAdapter
......@@ -23,9 +25,7 @@ import com.ym.game.module.WateringTaskEntity
import com.ym.game.net.GameApiClient
import com.ym.game.presenter.WateringRewardPresenter
import com.ym.library.Constant
import com.ym.library.config.AdManager
import com.ym.library.config.ZXADRewardVideo
import com.ym.library.listener.ZXADVideoListener
import com.ym.library.module.NewsEntity
import com.ym.library.net.BaseObserver
import com.ym.library.net.RxSchedulers
......@@ -121,10 +121,15 @@ class SiginDropsPopupwindow : PopupWindow(), WateringRewardContract.View,
3 -> dismiss()
6 -> {
dismiss()
JumpUtils.h5Jump("每日福利", Constant.Param.WelfareCenter, false,mContext as Activity)
JumpUtils.h5Jump(
"每日福利",
Constant.Param.WelfareCenter,
false,
mContext as Activity
)
}
4 -> {
EventUtils.onEvent("click_receive_coin_task_video_btn","领金币任务视频")
EventUtils.onEvent("click_receive_coin_task_video_btn", "领金币任务视频")
// mPresenter?.getRrchardDailyTask()
//看广告
// ToponManager.loadReward(
......@@ -173,67 +178,33 @@ class SiginDropsPopupwindow : PopupWindow(), WateringRewardContract.View,
// },
// AdID.mPlacementId_Reward_video_luck_farm
// )
AdManager.loadRewardVideoAd(
AdManager.playRewardAd(
ADConfig.AD_REWARD_VIDIO,
"",
(mContext as Activity),
object : ZXADVideoListener {
override fun onFail() {
}
override fun onSuccess() {
}
override fun onError() {
}
override fun onRewardVideoCached() {
}
override fun setRewardAdInteractionListener() {
}
override fun onRewardVerify() {
}
override fun onVideoError() {
// showToponWaterVideo()
}
override fun onRewardVideoAdLoad() {
}
override fun onRewardVideoAdLoad(entity: NewsEntity) {
}
override fun onAdShow() {
}
override fun onAdVideoBarClick(newsEntity: NewsEntity) {
}
override fun onAdClose() {
AdManager.loadNextCacheRewardVideoAd(
ADConfig.AD_REWARD_VIDIO,
mContext as Activity
)
getVideoAcceleratorsReceive2();
}
override fun onVideoComplete() {
override fun onAdShow() {
}
override fun onSkippedVideo() {
override fun onAdVideoBarClick() {
}
override fun onFullScreenVideoCached() {
override fun onError(errorMsg: String?) {
AdManager.loadNextCacheRewardVideoAd(
ADConfig.AD_REWARD_VIDIO,
mContext as Activity
)
}
override fun onLoadVideoAd(rewardVideoAD: ZXADRewardVideo) {
override fun onSuccess() {
}
})
}
......@@ -312,6 +283,7 @@ class SiginDropsPopupwindow : PopupWindow(), WateringRewardContract.View,
this.animationStyle = R.style.main_photo_anim
isClippingEnabled = false
}
//看视频领上报
fun getVideoAcceleratorsReceive2() {
GameApiClient.gameApi.adVideoReport()
......
......@@ -11,15 +11,16 @@ import android.view.MotionEvent
import android.view.View
import android.widget.ImageView
import android.widget.TextView
import com.ym.admodule.config.AdManager
import com.ym.admodule.listener.ZXADVideoListener
import com.ym.game.GameActivity
import com.ym.game.listener.IDialogViewCloseCallback
import com.ym.game.contract.TurntableContract
import com.ym.game.module.StatusEntity
import com.ym.game.module.TurntableEntity
import com.ym.game.net.GameApiClient
import com.ym.game.presenter.TurntablePresenter
import com.ym.library.config.AdManager
import com.ym.library.config.ZXADRewardVideo
import com.ym.library.listener.ZXADVideoListener
import com.ym.library.module.NewsEntity
import com.ym.library.net.BaseObserver
import com.ym.library.net.RxSchedulers
......@@ -32,6 +33,7 @@ import com.ym.library.utils.EventUtils
import com.ym.library.utils.LogUtils
import com.ym.library.utils.Utils
import com.ym.xync.R
import org.jetbrains.anko.act
/**
......@@ -187,81 +189,37 @@ object TurntableDialog : TurntableUtils(), TurntableContract.View {
// }
//
// }, AdID.mPlacementId_Reward_video_luck_farm)
AdManager.loadRewardVideoAd(
AdManager.playRewardAd(
ADConfig.AD_REWARD_VIDIO,
"",
(context as Activity),
object : ZXADVideoListener {
override fun onFail() {
}
override fun onSuccess() {
}
override fun onError() {
reset()
btnTurntableLottery?.isEnabled = false
isStartAnim = true
isUpdate = true
mPresenter?.getTurntableLotteryResult()
}
override fun onRewardVideoCached() {
}
override fun setRewardAdInteractionListener() {
}
override fun onRewardVerify() {
}
override fun onVideoError() {
// showToponWaterVideo()
override fun onAdClose() {
AdManager.loadNextCacheRewardVideoAd(ADConfig.AD_REWARD_VIDIO, context as Activity)
getVideoAcceleratorsReceive3();
reset()
btnTurntableLottery?.isEnabled = false
isStartAnim = true
isUpdate = true
mPresenter?.getTurntableLotteryResult()
}
override fun onRewardVideoAdLoad() {
}
override fun onRewardVideoAdLoad(entity: NewsEntity) {
}
override fun onAdShow() {
}
override fun onAdVideoBarClick(newsEntity: NewsEntity) {
override fun onAdVideoBarClick() {
}
override fun onAdClose() {
getVideoAcceleratorsReceive3();
override fun onError(errorMsg: String?) {
AdManager.loadNextCacheRewardVideoAd(ADConfig.AD_REWARD_VIDIO, context as Activity)
reset()
btnTurntableLottery?.isEnabled = false
isStartAnim = true
isUpdate = true
}
override fun onVideoComplete() {
}
override fun onSkippedVideo() {
}
mPresenter?.getTurntableLotteryResult()
override fun onFullScreenVideoCached() {
}
override fun onLoadVideoAd(rewardVideoAD: ZXADRewardVideo) {
override fun onSuccess() {
}
})
}
......@@ -423,6 +381,7 @@ object TurntableDialog : TurntableUtils(), TurntableContract.View {
this.onTouchEvent(event)
}
}
//看视频领上报
fun getVideoAcceleratorsReceive3() {
GameApiClient.gameApi.adVideoReport()
......
......@@ -27,6 +27,9 @@ allprojects {
maven {
url "http://test.vlion.cn:8081/nexus/content/repositories/inland/"
}
maven{
url "http://zx-maven.huolea.com/repository/admodule/"
}
}
}
......
......@@ -20,6 +20,9 @@ android {
// 还可以添加 'x86', 'x86_64', 'mips', 'mips64'
}
// manifestPlaceholders = [
// "APPLICATION_ID": applicationId,
// ]
}
sourceSets {
......@@ -59,60 +62,64 @@ repositories {
dependencies {
api fileTree(include: ['*.jar'], dir: 'libs')
api fileTree(include: ['*.aar'], dir: 'libs')
api 'androidx.appcompat:appcompat:1.2.0-alpha02'
api 'com.android.support:design:28.0.0'
api 'com.android.support:support-v4:28.0.0'
api 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.72'
api 'com.github.bumptech.glide:glide:4.9.0'
api 'jp.wasabeef:glide-transformations:4.0.1'
api 'com.android.support:multidex:1.0.0'
api 'com.squareup.okhttp3:okhttp:3.10.0'
api 'com.squareup.okhttp3:logging-interceptor:3.4.1'
api 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
api 'com.trello.rxlifecycle2:rxlifecycle:2.2.0'
api 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.0'
api 'com.squareup.retrofit2:retrofit:2.3.0'
api 'com.squareup.retrofit2:converter-gson:2.3.0'
api 'com.squareup.okhttp3:logging-interceptor:3.4.1'
api 'org.jetbrains.anko:anko-common:0.9'
api 'com.badoo.mobile:android-weak-handler:1.1'
// api 'androidx.appcompat:appcompat:1.2.0-alpha02'
// api 'com.android.support:design:28.0.0'
// api 'com.android.support:support-v4:28.0.0'
// api 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.72'
// api 'com.github.bumptech.glide:glide:4.9.0'
// api 'jp.wasabeef:glide-transformations:4.0.1'
// api 'com.android.support:multidex:1.0.0'
// api 'com.squareup.okhttp3:okhttp:3.10.0'
// api 'com.squareup.okhttp3:logging-interceptor:3.4.1'
// api 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'
// api 'com.trello.rxlifecycle2:rxlifecycle:2.2.0'
// api 'com.trello.rxlifecycle2:rxlifecycle-components:2.2.0'
// api 'com.squareup.retrofit2:retrofit:2.3.0'
// api 'com.squareup.retrofit2:converter-gson:2.3.0'
// api 'com.squareup.okhttp3:logging-interceptor:3.4.1'
// api 'org.jetbrains.anko:anko-common:0.9'
// api 'com.badoo.mobile:android-weak-handler:1.1'
api 'com.gyf.immersionbar:immersionbar:3.0.0'
//AndroidX
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'
//sdk相关
implementation 'com.android.support:support-v4:28.+'
implementation 'com.android.support:appcompat-v7:28.0.0'
// 2.6.5之后的版本,SDK有依赖recyclerview-v7
// //AndroidX
// implementation 'androidx.legacy:legacy-support-v4:1.0.0'
// implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'
//
// //sdk相关
// implementation 'com.android.support:support-v4:28.+'
// implementation 'com.android.support:appcompat-v7:28.0.0'
// // 2.6.5之后的版本,SDK有依赖recyclerview-v7
implementation 'com.android.support:recyclerview-v7:28.0.0'
// implementation 'com.google.code.gson:gson:2.8.5'
// implementation files('libs/poi-3.0-rc4-20070503.jar')
//// implementation 'com.google.code.gson:gson:2.8.5'
//// implementation files('libs/poi-3.0-rc4-20070503.jar')
//
api 'com.tencent.bugly:crashreport:latest.release'
api 'com.tencent.bugly:nativecrashreport:latest.release'
api('cn.vlion.inland:inlandmix:9.8.5') {
exclude group: 'cn.vlion.inland', module: 'inlandb'
exclude group: 'cn.vlion.inland', module: 'inlandg'
exclude group: 'cn.vlion.inland', module: 'inlands'
exclude group: 'cn.vlion.inland', module: 'inlandt'
exclude group: 'cn.vlion.inland', module: 'inlandtf'
exclude group: 'pl.droidsonroids.gif'
exclude group: 'cn.vlion.inland', module: 'inlandk'
exclude group: 'cn.vlion.inland', module: 'inlandimb'
exclude group: 'com.squareup.picasso'
exclude group: 'cn.vlion.inland', module: 'inlanddk'
exclude group: 'com.github.bumptech.glide'
exclude group: 'com.tuia'
exclude group: 'cn.vlion.inland', module: 'inlandhy'
exclude group: 'com.mintegral.msdk'
exclude group: 'cn.vlion.inlandsh'
//
// api('cn.vlion.inland:inlandmix:9.8.5') {
// exclude group: 'cn.vlion.inland', module: 'inlandb'
// exclude group: 'cn.vlion.inland', module: 'inlandg'
// exclude group: 'cn.vlion.inland', module: 'inlands'
// exclude group: 'cn.vlion.inland', module: 'inlandt'
// exclude group: 'cn.vlion.inland', module: 'inlandtf'
// exclude group: 'pl.droidsonroids.gif'
// exclude group: 'cn.vlion.inland', module: 'inlandk'
// exclude group: 'cn.vlion.inland', module: 'inlandimb'
// exclude group: 'com.squareup.picasso'
// exclude group: 'cn.vlion.inland', module: 'inlanddk'
// exclude group: 'com.github.bumptech.glide'
// exclude group: 'com.tuia'
// exclude group: 'cn.vlion.inland', module: 'inlandhy'
// exclude group: 'com.mintegral.msdk'
// exclude group: 'cn.vlion.inlandsh'
// }
api 'com.ym.admodule:admodule:1.0.1.7'
api ("com.bx:adsdk:1.3.3"){
exclude group: 'com.google.code.gson'
}
api "com.bx:adsdk:1.3.3"
}
//configurations {
// all*.exclude group: 'com.google.code.gson'
//}
{
"h5_url": {
"wx_share": "https://newspool.aichuangzuo.cn/jijuShare/share.html",
"onlineService": "https://cdn-apph5.zhangxinzhixun.com/location/Service",
"pay": "https://newspool.huolea.com/sspapiNovel/su/custom/jiluapp/pay.html",
"privacy": "https://newspool.huolea.com/sspapiNovel/su/custom/jiluapp/privacy.html",
"invite": "https://newspool.aichuangzuo.cn/jijuShare/invitation.html",
"tutorial": "https://cdn-apph5.zhangxinzhixun.com/location/UsingTutorial",
"user": "https://newspool.huolea.com/sspapiNovel/su/custom/jiluapp/user.html"
},
"pay_config": {
"wx": {
"status": 1
},
"ali": {
"status": 1
}
},
"lua": "",
"check": 1,
"md5": "a5adff92353f772db544b8c389c5e0d2"
}
\ No newline at end of file
package com.ayl.ces.jni
import android.content.Context
import android.util.Log
/**
* Created by gaoleichao on 2018/7/13.
*/
class CesCore {
lateinit var mContext: Context
var isInit: Boolean = false
init {
System.loadLibrary("native-lib")
}
companion object {
/**
* @param
*/
@Volatile
var mCesCore: CesCore? = null
fun getInstance(): CesCore {
if (mCesCore == null) {
synchronized(CesCore::class.java) {
if (mCesCore == null) {
mCesCore = CesCore()
}
}
}
return mCesCore!!
}
}
fun init(context: Context) {
mContext = context
native_init(mContext)
}
fun SmData(): String {
return sm_work(mContext)
}
fun setData(strS: String) {
SetData(strS)
isInit = true
Log.d("splash", "isInit:" + isInit)
}
fun getIsInit(): Boolean {
return isInit
}
private external fun native_init(context: Context?)
private external fun sm_work(context: Context?): String
/////////////////////////////////////
external fun SetData(strSource: String): Boolean
external fun Dowork(src: String, client_no: String): String
external fun Dework(src: String, client_no: String): String
external fun Sgwork(src: String): String
external fun Ckwork(client_no: String): String
external fun Version(): String
}
\ No newline at end of file
package com.ym.library
import android.content.Context
import android.text.TextUtils
import android.util.Log
import com.ym.library.utils.LogUtils
import com.ym.library.utils.PhoneUtils
import com.ym.library.utils.SettingPreference
import com.ym.library.utils.Utils
import org.jetbrains.anko.doAsync
import java.lang.Exception
/**
* Created by gaoleichao on 2018/7/12.
*/
class Config {
companion object {
fun init(context: Context) {
doAsync {
try {
if (TextUtils.isEmpty(SettingPreference.getUid())) {
SettingPreference.setUid(SettingPreference.getUid())
}
SettingPreference.setModel(PhoneUtils.getModel())
SettingPreference.setAndroidId(PhoneUtils.getAndroidID(context))
SettingPreference.setCarrier(PhoneUtils.getOperator(context))
SettingPreference.setW(PhoneUtils.getScreenWidth(context).toString())
SettingPreference.setH(PhoneUtils.getScreenHeight(context).toString())
SettingPreference.setDevice(PhoneUtils.getDeviceId(context))
SettingPreference.setImei(PhoneUtils.getImei(context))
SettingPreference.setSsid(PhoneUtils.getBSSID(context))
SettingPreference.setImsi(PhoneUtils.getIMSI(context))
SettingPreference.setMac(PhoneUtils.getMac(context))
// SettingPreference.setEnv(CesCore.getInstance().Ckwork(PhoneUtils.getAndroidID(context)))
SettingPreference.setVC(PhoneUtils.getAppVersionCode(context).toString())
SettingPreference.setVN(PhoneUtils.getAppVersionName(context))
SettingPreference.setNTT(PhoneUtils.getNetworkType(context).toString())
SettingPreference.setMac(PhoneUtils.getMac(context))
SettingPreference.setIp(PhoneUtils.getIPAddress(false))
SettingPreference.setSource(Utils.getChannel(context))
SettingPreference.setSVN(""+android.os.Build.VERSION.SDK_INT)
}catch (e:Exception){}
LogUtils.d("Param", "Param.svn: " + Constant.Param.svn)
LogUtils.d("Param", "Param.vendor: " + Constant.Param.vendor)
LogUtils.d("Param", "Param.uid: " + SettingPreference.getUid())
LogUtils.d("Param", "Param.androidId: " + SettingPreference.getAndroidId())
Log.d("Param","getAndroidId:"+SettingPreference.getAndroidId())
LogUtils.d("Param", "Param.carrier: " + SettingPreference.getCarrier())
LogUtils.d("Param", "Param.w: " + SettingPreference.getW())
LogUtils.d("Param", "Param.h: " + SettingPreference.getH())
LogUtils.d("Param", "Param.model: " + SettingPreference.getModel())
LogUtils.d("Param", "Param.vc: " + SettingPreference.getVC())
Log.d("Param", "Param.device: " + SettingPreference.getDevice())
LogUtils.d("Param", "Param.imei: " + SettingPreference.getImei())
LogUtils.d("Param", "Param.mac: " + SettingPreference.getMac())
LogUtils.d("Param", "Param.ntt: " + SettingPreference.getNTT())
LogUtils.d("Param", "Param.imsi: " + SettingPreference.getImsi())
// LogUtils.d("Param", "Param.env: " + SettingPreference.getEnv())
}
}
}
}
\ No newline at end of file
......@@ -4,7 +4,7 @@ import android.Manifest;
import android.os.Build;
import com.ym.library.net.LatestLoginInfo;
import com.ym.library.utils.PhoneUtils;
import com.ym.modulecommon.utils.PhoneUtils;
import java.util.List;
......
......@@ -59,12 +59,12 @@ abstract class JavaInterface {
@JavascriptInterface
fun getNovelUid(): String? {
System.out.println("getNovelUid()")
return SettingPreference.getUid()
return com.ym.modulecommon.utils.SettingPreference.getUid()
}
@JavascriptInterface
fun getUserInfo(): String? {
var entity = SettingPreference.getUserInfoData()
var entity = com.ym.modulecommon.utils.SettingPreference.getUserInfoData()
if (entity != null) {
var data = Utils.obj2Str(entity)
System.out.println("getUserInfoData():$data")
......@@ -86,7 +86,7 @@ abstract class JavaInterface {
*/
@JavascriptInterface
fun getToken(): String {
return SettingPreference.getToken()
return com.ym.modulecommon.utils.SettingPreference.getToken()
}
/**
......@@ -95,7 +95,7 @@ abstract class JavaInterface {
@JavascriptInterface
fun availCoins(): Int {
var user = SettingPreference.getUserInfoData()
var user = com.ym.modulecommon.utils.SettingPreference.getUserInfoData()
println("availCoins()-------------$user-----")
return user?.availCoins ?: 0
......@@ -461,27 +461,27 @@ abstract class JavaInterface {
val params = JSONObject()
val ts = System.currentTimeMillis()
params.put(Constant.Device.ts, ts)
params.put(Constant.Device.uid, SettingPreference.getUid())
params.put(Constant.Device.token, SettingPreference.getToken())
params.put(Constant.Device.uid, com.ym.modulecommon.utils.SettingPreference.getUid())
params.put(Constant.Device.token, com.ym.modulecommon.utils.SettingPreference.getToken())
params.put(Constant.Device.aid, SettingPreference.getAndroidId())
params.put(Constant.Device.imei, SettingPreference.getImei())
params.put(Constant.Device.device, SettingPreference.getDevice())
params.put(Constant.Device.mac, SettingPreference.getMac())
params.put(Constant.Device.aid, com.ym.modulecommon.utils.SettingPreference.getAndroidId())
params.put(Constant.Device.imei, com.ym.modulecommon.utils.SettingPreference.getImei())
params.put(Constant.Device.device, com.ym.modulecommon.utils.SettingPreference.getDevice())
params.put(Constant.Device.mac, com.ym.modulecommon.utils.SettingPreference.getMac())
params.put(Constant.Device.platform, "android")
params.put(Constant.Device.carrier, SettingPreference.getCarrier())
params.put(Constant.Device.w, SettingPreference.getW())
params.put(Constant.Device.carrier, com.ym.modulecommon.utils.SettingPreference.getCarrier())
params.put(Constant.Device.w, com.ym.modulecommon.utils.SettingPreference.getW())
params.put(Constant.Device.vendor, Build.MANUFACTURER)
params.put(Constant.Device.h, SettingPreference.getH())
params.put(Constant.Device.ip, SettingPreference.getIp())
params.put(Constant.Device.imsi, SettingPreference.getImsi())
params.put(Constant.Device.model, SettingPreference.getModel())
params.put(Constant.Device.vn, SettingPreference.getVN())
params.put(Constant.Device.ntt, SettingPreference.getNTT())
params.put(Constant.Device.vc, SettingPreference.getVC())
params.put(Constant.Device.source, SettingPreference.getSource())
params.put(Constant.Device.ua, SettingPreference.getUA())
params.put(Constant.Device.svn, SettingPreference.getSVN())
params.put(Constant.Device.h, com.ym.modulecommon.utils.SettingPreference.getH())
params.put(Constant.Device.ip, com.ym.modulecommon.utils.SettingPreference.getIp())
params.put(Constant.Device.imsi, com.ym.modulecommon.utils.SettingPreference.getImsi())
params.put(Constant.Device.model, com.ym.modulecommon.utils.SettingPreference.getModel())
params.put(Constant.Device.vn, com.ym.modulecommon.utils.SettingPreference.getVN())
params.put(Constant.Device.ntt, com.ym.modulecommon.utils.SettingPreference.getNTT())
params.put(Constant.Device.vc, com.ym.modulecommon.utils.SettingPreference.getVC())
params.put(Constant.Device.source, com.ym.modulecommon.utils.SettingPreference.getSource())
params.put(Constant.Device.ua, com.ym.modulecommon.utils.SettingPreference.getUA())
params.put(Constant.Device.svn, com.ym.modulecommon.utils.SettingPreference.getSVN())
var param = obj2Array(params)
System.out.println("-------------:$param")
return params.toString()
......@@ -624,7 +624,7 @@ abstract class JavaInterface {
@JavascriptInterface
fun withDraw() {
val token = SettingPreference.getToken()
val token = com.ym.modulecommon.utils.SettingPreference.getToken()
if (token.isEmpty()) {
WxImplUtils().onAuth(act, object : WxImplUtils.IWxLoginCallback {
override fun onWxSuccess(token: String?, openid: String?) {
......
......@@ -16,6 +16,7 @@ import com.ym.library.R
import com.ym.library.module.ReportEntity
import com.ym.library.net.*
import com.ym.library.utils.EventUtils
import com.ym.library.utils.GsonInstance
import com.ym.library.utils.SettingPreference
import com.ym.library.utils.Utils
import kotlinx.android.synthetic.main.activity_xiaoman.*
......@@ -35,7 +36,7 @@ class XiaoManActivity : BaseActivity() {
* @param placeId 资源位id:必传
* @param callback CampaignCallback 回调
*/
campaignFragment = CampaignFragment.newInstance(SettingPreference.getToken())
campaignFragment = CampaignFragment.newInstance(com.ym.modulecommon.utils.SettingPreference.getToken())
campaignFragment?.setPlaceId("2758")
campaignFragment?.setCallback(object : CampaignCallback() {
override fun showAd(params: String) {
......
......@@ -6,7 +6,7 @@ import android.view.Gravity
import android.view.View
import android.view.ViewGroup
import com.ym.library.AppliContext
import com.ym.library.utils.PhoneUtils
import com.ym.modulecommon.utils.PhoneUtils
/**
* Created by gaoleichao on 2020-06-03
......
package com.ym.library.bd
import android.app.Activity
import android.os.Handler
import android.os.Message
import android.os.SystemClock
import android.util.Log
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.TextView
import android.widget.Toast
import com.baidu.mobads.*
import com.baidu.mobads.rewardvideo.RewardVideoAd
import com.ym.library.config.*
import com.ym.library.listener.ADListener
import com.ym.library.listener.ZXADExpressListener
import com.ym.library.listener.ZXADSplashListener
import com.ym.library.listener.ZXADVideoListener
import com.ym.library.module.NewsEntity
import com.ym.library.net.AdUpload
import com.ym.library.utils.EventUtils
import com.ym.library.utils.LogHelper
object BDADUtils {
private const val TAG = "AdManager"
//开屏
fun loadSplashAd(newsEntity: NewsEntity, activity: Activity, container: ViewGroup, zxadListener: ZXADSplashListener?, skipView: TextView?,zxadCallback: ZXADCallback) {
// 广告展现前先调用sdk初始化方法,可以有效缩短广告第一次展现所需时间
BaiduManager.init(activity)
container.visibility = View.VISIBLE
// 增加lp页面关闭回调,不需要该回调的继续使用原来接口就可以
val listener: SplashLpCloseListener = object : SplashLpCloseListener {
override fun onLpClosed() {
// Toast.makeText(activity, "lp页面关闭", Toast.LENGTH_SHORT).show()
zxadListener?.onAdSkip()
Log.d(TAG,"百度 开屏 onLpClosed")
}
override fun onAdDismissed() {
zxadListener?.onAdSkip()
Log.d(TAG,"百度 开屏 onAdDismissed")
}
override fun onAdFailed(arg0: String) {
EventUtils.onEventPullFail(newsEntity)
Log.d(TAG,"百度 开屏 onAdFailed" + arg0)
zxadListener?.onAdSkip()
zxadCallback.onAdFail()
}
override fun onAdPresent() {
Log.d(TAG,"百度 开屏 onAdPresent")
container.setVisibility(View.GONE)
}
override fun onAdClick() {
Log.d(TAG,"百度 开屏 onAdClick")
// 设置开屏可接受点击时,该回调可用
zxadListener?.onAdClicked(newsEntity)
// AdUpload.onAdClick(newsEntity)
EventUtils.apiClient(newsEntity?.clk_tracking[0])
}
}
val adPlaceId = newsEntity.codeId // 重要:请填上您的广告位ID,代码位错误会导致无法请求到广告
// 等比缩小放大,裁剪边缘部分
// SplashAd.setBitmapDisplayMode(BitmapDisplayMode.DISPLAY_MODE_CENTER_CROP);
// 等比缩小放大,裁剪边缘部分
// SplashAd.setBitmapDisplayMode(BitmapDisplayMode.DISPLAY_MODE_CENTER_CROP);
SplashAd(activity, container, listener, adPlaceId, true)
// AdUpload.onAdImpression(newsEntity)
EventUtils.apiClient(newsEntity?.imp_tracking[0])
}
//插屏广告
fun loadInteractionAd(
activity: Activity,
newsEntity: NewsEntity,
callback: ZXADCallback
) {
var mInterAd = InterstitialAd(activity, newsEntity.codeId)
mInterAd.setListener(object :InterstitialAdListener{
override fun onAdFailed(p0: String?) {
EventUtils.onEventShowFail(newsEntity)
callback.onAdFail()
}
override fun onAdDismissed() {
}
override fun onAdPresent() {
}
override fun onAdClick(p0: InterstitialAd?) {
// AdUpload.onAdClick(newsEntity)
}
override fun onAdReady() {
mInterAd.showAd(activity)
// AdUpload.onAdImpression(newsEntity)
}
})
//加载广告
mInterAd.loadAd()
}
//激励视频
fun loadRewardVideoAd(
activity: Activity,
newsEntity: NewsEntity,
listener: ZXADVideoListener,
callback: ZXADCallback
) {
// 激励视屏产品可以选择是否使用SurfaceView进行渲染视频
var mRewardVideoAd = RewardVideoAd(
activity,
newsEntity.codeId, object :RewardVideoAd.RewardVideoAdListener{
override fun onAdFailed(p0: String?) {
EventUtils.onEventPullFail(newsEntity)
callback.onAdFail()
listener.onError()
}
override fun playCompletion() {
listener.onVideoComplete()
}
override fun onAdShow() {
// AdUpload.onAdImpression(newsEntity)
EventUtils.apiClient(newsEntity?.imp_tracking[0])
callback.onAdSuccess()
}
override fun onAdClick() {
// AdUpload.onAdClick(newsEntity)
EventUtils.apiClient(newsEntity?.clk_tracking[0])
}
override fun onAdClose(p0: Float) {
listener.onAdClose()
}
override fun onVideoDownloadSuccess() {
}
override fun onVideoDownloadFailed() {
}
}, true)
mRewardVideoAd.load()
var startTime = System.currentTimeMillis()
val handler = object : Handler() {
override fun handleMessage(msg: Message) {
super.handleMessage(msg)
if(System.currentTimeMillis()-startTime<3000){
if (mRewardVideoAd != null) {
mRewardVideoAd.show()
removeCallbacksAndMessages(null)
} else{
sendEmptyMessageDelayed(1,20)
}
}else{
EventUtils.onEventPullFail(newsEntity)
removeCallbacksAndMessages(null)
}
}
}
handler.sendEmptyMessageDelayed(1,20)
}
//信息流 原生
fun loadFeedNativeAd(activity:Activity,newsEntity: NewsEntity,zxadCallback: ZXADCallback){
val zxAdSlot = ZXAdSlot()
zxAdSlot.codeID = newsEntity.codeId
zxAdSlot.count = 3
zxAdSlot.sizeConfig = ZXADSizeConfig(300,300)
val zxadNative = ZXADNative(activity, newsEntity, zxAdSlot)
zxadNative.loadAd(object :ADListener.NativeNetListener{
override fun onAdFailed(error: AdError?) {
}
override fun onAdLoaded(nativeData: NativeDataAD?) {
}
})
}
//加载信息流广告
fun loadFeedAd(
activity: Activity,
newsEntity: NewsEntity,
zxadModelConfig: ZXADSizeConfig,
zxadExpressListener: ZXADExpressListener,
container: FrameLayout,
callback: ZXADCallback
) {
// // 默认请求大图广+ICON样式
//// fetchNativeAd(BIG_PIC_AD_PLACE_ID);
// /**
// * Step 1. 创建BaiduNative对象,参数分别为: 上下文context,广告位ID
// * 注意:请将adPlaceId替换为自己的广告位ID
// * 注意:信息流广告对象,与广告位id一一对应,同一个对象可以多次发起请求
// */
// var mBaiduNativeManager = BaiduNativeManager(activity, newsEntity.codeId)
//
// // 若与百度进行相关合作,可使用如下接口上报广告的上下文
//
// // 若与百度进行相关合作,可使用如下接口上报广告的上下文
// val requestParameters = RequestParameters.Builder()
// .downloadAppConfirmPolicy(RequestParameters.DOWNLOAD_APP_CONFIRM_ONLY_MOBILE) // 用户维度:用户性别,取值:0-unknown,1-male,2-female
// .addExtra(ArticleInfo.USER_SEX, "1") // 用户维度:收藏的小说ID,最多五个ID,且不同ID用'/分隔'
// .addExtra(ArticleInfo.FAVORITE_BOOK, "这是小说的名称1/这是小说的名称2/这是小说的名称3") // 内容维度:小说、文章的名称
// .addExtra(ArticleInfo.PAGE_TITLE, "测试书名") // 内容维度:小说、文章的ID
// .addExtra(ArticleInfo.PAGE_ID, "10930484090") // 内容维度:小说分类,一级分类和二级分类用'/'分隔
// .addExtra(ArticleInfo.CONTENT_CATEGORY, "一级分类/二级分类") // 内容维度:小说、文章的标签,最多10个,且不同标签用'/分隔'
// .addExtra(ArticleInfo.CONTENT_LABEL, "标签1/标签2/标签3")
// .build()
//
// mBaiduNativeManager.loadFeedAd(requestParameters, object :BaiduNativeManager.FeedAdListener{
// override fun onNativeLoad(p0: MutableList<NativeResponse>?) {
//
// }
//
// override fun onNativeFail(p0: NativeErrorCode?) {
// }
//
// override fun onLpClosed() {
// }
//
// override fun onVideoDownloadSuccess() {
// }
//
// override fun onVideoDownloadFailed() {
// }
//
// })
}
}
\ No newline at end of file
package com.ym.library.bd;
import android.graphics.Bitmap;
import com.baidu.mobad.feeds.NativeResponse;
import com.ym.library.config.NativeADWrapper;
import com.ym.library.config.ZXADType;
import java.util.ArrayList;
import java.util.List;
public class NativeAdForBAI implements NativeADWrapper {
private NativeResponse nativeResponse;
private long mStartTime;
private long VALID_TIME = 30 * 60 * 1000;//
public NativeAdForBAI(NativeResponse response) {
nativeResponse = response;
mStartTime = System.currentTimeMillis();
}
@Override
public String getAdId() {
return ZXADType.AD_ID_BAI;
}
@Override
public List<String> getAdImageUrl() {
// 这里特殊的是 不知道返回的 大图还是单图 多图,所以做一个图片的集合返回
List<String> lists = new ArrayList<>();
lists.add(nativeResponse.getImageUrl());
lists.addAll(nativeResponse.getMultiPicUrls());
return lists;
}
@Override
public String getAdIconUrl() {
return nativeResponse.getIconUrl();
}
@Override
public String getAdContent() {
return nativeResponse.getDesc();
}
@Override
public String getAdCallToAction() {
return null;
}
@Override
public String getAdTitle() {
return nativeResponse.getTitle();
}
@Override
public float getAdStarRating() {
return 0;
}
@Override
public String getAdSource() {
return null;
}
@Override
public boolean isValid() {
return (System.currentTimeMillis() - mStartTime) < VALID_TIME;
}
@Override
public int getAdMaterialType() {
return 0;
}
@Override
public int getAdActionType() {
return 0;
}
@Override
public Bitmap getSDKLogo() {
// csj kua 默认返回都是bitmap gdt无返回,此处默认bai无返回
return null;
}
@Override
public void destroy() {
}
@Override
public int getAdChannelType() {
return ZXADType.AD_TYPE_BAI;
}
@Override
public String getAdChannelName() {
return ZXADType.AD_CHANNEL_BAI;
}
@Override
public Object getOrgAdData() {
return nativeResponse;
}
}
package com.ym.library.bd;
import android.content.Context;
import com.baidu.mobad.feeds.BaiduNative;
import com.baidu.mobad.feeds.NativeErrorCode;
import com.baidu.mobad.feeds.NativeResponse;
import com.ym.library.config.BaseChannel;
import com.ym.library.config.NativeADWrapper;
import com.ym.library.config.ZXAdSlot;
import com.ym.library.utils.LogHelper;
import java.util.List;
public class NativeBAICache extends BaseChannel implements BaiduNative.BaiduNativeNetworkListener {
private static final String TAG = NativeBAICache.class.getSimpleName();
private BaiduNative mNative;
private ZXAdSlot zxAdSlot;
public NativeBAICache(Context context, int sid, int cacheSize, long wt, ZXAdSlot zxAdSlot) {
super(context, sid, cacheSize, wt);
this.zxAdSlot = zxAdSlot;
doInit(mContext);
}
@Override
public void doInit(Context context) {
mNative = new BaiduNative(context, zxAdSlot.codeID, this);
}
@Override
public NativeADWrapper doGetAD() {
return super.doGetAD();
}
@Override
public void doLoadAd() {
if (!isRefreshing) {
if (getCacheSize() < mCacheSize) {
LogHelper.d(TAG, "BAI cache start refreshing");
isRefreshing = true;
mNative.makeRequest();
} else {
LogHelper.d(TAG, "BAI no need refresh ! getValidCount :" + getCacheSize());
}
} else {
LogHelper.d(TAG, "BAI cache Already refreshing");
}
}
@Override
public int getCacheSize() {
int valid = 0;
for (NativeADWrapper ad : mCacheList) {
if (ad.isValid()) {
valid++;
}
}
LogHelper.d(TAG, "BAI getCacheSize :" + valid);
return valid;
}
@Override
public void doClear() {
}
@Override
public void doDestroy() {
}
@Override
public void onNativeLoad(List<NativeResponse> list) {
isRefreshing = false;
isError = false;
LogHelper.d(TAG, "BAI Cache load Success" + list.size() + list.get(0).getTitle());
for (NativeResponse nativeAd : list) {
mCacheList.add(new NativeAdForBAI(nativeAd));
}
}
@Override
public void onNativeFail(NativeErrorCode nativeErrorCode) {
isRefreshing = false;
isError = true;
LogHelper.d(TAG, "BAI Cache load Error: code = " + nativeErrorCode + ", msg = " + nativeErrorCode.name());
}
}
package com.ym.library.config;
import android.graphics.Bitmap;
import android.view.View;
import android.view.ViewGroup;
import com.ym.library.listener.ADListener;
import java.util.List;
public interface NativeDataAD {
/**
* 广告logo
*
* @return
*/
Bitmap getAdLogo();
/**
* 标题
*
* @return
*/
String getAdTitle();
/**
* 描述
*
* @return
*/
String getAdDesc();
/**
* 点击button响应文案
*
* @return
*/
String getAdCallToAction();
/**
* 广告来源
*
* @return
*/
String getSource();
/**
* 广告Icon URL
*
* @return
*/
String getAdIconUrl();
/**
* 广告大图/多图 图片URL
*
* @return
*/
List<String> getImageList();
/**
* APP Icon Url,非下载或为空
*
* @return
*/
String getAppIconUrl();
/**
* APP 商店评分
*
* @return
*/
float getAppScore();
/**
* APP评论数
*
* @return
*/
int getAppCommentNum();
/**
* APP 文件大小(下载类)
*
* @return
*/
int getAppSize();
/**
* 视频广告封面图
*
* @return
*/
String getAdVideoCoverImage();
void registerViewForInteraction(ViewGroup container, List<View> clickViews, ADListener.InteractionListener listener);
void registerViewForInteraction(ViewGroup container, View view, List<View> clickViews, ADListener.InteractionListener listener);
}
package com.ym.library.config
//优先级,重试机制
interface ZXADCallback {
fun onAdSuccess()
fun onAdFail()
}
\ No newline at end of file
package com.ym.library.config
import com.bytedance.sdk.openadsdk.TTAdConstant
object ZXADConfig {
var IS_DEUG = true
//广点通 appId
var GDT_AD_APP_ID = ""
//穿山甲 appId
var TT_AD_APP_ID = ""
//SIGNMOB appId
var SIGNMOB_APP_ID = ""
var SIGNMOB_APP_KEY = ""
//baidu appId
var BAIDU_APP_ID = ""
//优量包 appId
var YLB_APP_ID = ""
//快手 appId
var KS_APP_ID = ""
//瑞狮 appId
var RS_APP_ID = ""
//是否使用 TextureView
var useTextureView = false
//titlebar
var titleBarTheme = TTAdConstant.TITLE_BAR_THEME_DARK
//允许通知
var allowShowNotify = true
//允许锁屏状态下显示落地页
var allowShowPageWhenScreenLock = true
//是否支持多进程
var supportMultiProcess = false//默认false
//应用名字
var appName = "test"//默认false
var zxadConfig: ZXADConfig = ZXADConfig
fun getInstances(): ZXADConfig {
if(zxadConfig ==null){
zxadConfig = ZXADConfig
}
return zxadConfig
}
fun Build(): ZXADConfig {
return getInstances()
}
fun isDebug(s: Boolean): ZXADConfig {
IS_DEUG = s
return zxadConfig
}
fun gdtId(gdtId: String): ZXADConfig {
GDT_AD_APP_ID = gdtId
return zxadConfig
}
fun csjId(csjId: String): ZXADConfig {
TT_AD_APP_ID = csjId
return zxadConfig
}
fun bdId(bdId: String): ZXADConfig {
BAIDU_APP_ID = bdId
return zxadConfig
}
fun signMob(appid:String,appkey :String): ZXADConfig {
SIGNMOB_APP_ID = appid
SIGNMOB_APP_KEY = appkey
return zxadConfig
}
fun ylbId(appid:String): ZXADConfig {
YLB_APP_ID = appid
return zxadConfig
}
fun ksId(appid:String): ZXADConfig {
KS_APP_ID = appid
return zxadConfig
}
fun rsId(appid:String): ZXADConfig {
RS_APP_ID = appid
return zxadConfig
}
fun useTextureView(useTextureView: Boolean): ZXADConfig {
ZXADConfig.useTextureView = useTextureView
return zxadConfig
}
fun titleBarTheme(titleBarTheme: Int): ZXADConfig {
ZXADConfig.titleBarTheme = titleBarTheme
return zxadConfig
}
fun allowShowNotify(allowShowNotify: Boolean): ZXADConfig {
ZXADConfig.allowShowNotify = allowShowNotify
return zxadConfig
}
fun allowShowPageWhenScreenLock(allowShowPageWhenScreenLock: Boolean): ZXADConfig {
ZXADConfig.allowShowPageWhenScreenLock = allowShowPageWhenScreenLock
return zxadConfig
}
fun supportMultiProcess(supportMultiProcess: Boolean): ZXADConfig {
ZXADConfig.supportMultiProcess = supportMultiProcess
return zxadConfig
}
fun appName(appName: String): ZXADConfig {
ZXADConfig.appName = appName
return zxadConfig
}
}
\ No newline at end of file
package com.ym.library.config;
import android.content.Context;
import android.graphics.Bitmap;
import android.view.View;
import android.view.ViewGroup;
import com.bytedance.sdk.openadsdk.TTNativeAd;
import com.qq.e.ads.nativ.NativeUnifiedADData;
import com.qq.e.ads.nativ.widget.NativeAdContainer;
import com.ym.library.listener.ADListener;
import com.ym.library.module.NewsEntity;
import com.ym.library.utils.EventUtils;
import com.ym.library.utils.LogHelper;
import java.util.List;
public class ZXADNative implements NativeDataAD {
private static final String TAG = ZXADNative.class.getSimpleName();
private NativeADWrapper mNativeAd;
private Context mContext;
private NewsEntity newsEntity;
private ZXADRequestController adRequestController;
private ADListener.NativeNetListener mLoadListener;
private boolean isAdShow = false;
// public ZXNativeAd(Context context, int sid) {
// this(context, sid, 1);
// }
public ZXADNative(Context context, NewsEntity newsEntity, ZXAdSlot zxAdSlot) {
mContext = context;
this.newsEntity = newsEntity;
adRequestController = ZXPullRequestInstance.getInstance(context).getAdController(newsEntity, zxAdSlot);
}
public NativeADWrapper getCacheAD() {
return adRequestController.getAd();
}
public void loadAd(ADListener.NativeNetListener nativeListener) {
mLoadListener = nativeListener;
adRequestController.setLoadListener(EMPTY_LISTENER);
adRequestController.loadAd();
}
@Override
public Bitmap getAdLogo() {
if (null != mNativeAd) {
return mNativeAd.getSDKLogo();
}
return null;
}
@Override
public String getAdTitle() {
if (null != mNativeAd) {
return mNativeAd.getAdTitle();
}
return null;
}
@Override
public String getAdDesc() {
if (null != mNativeAd) {
mNativeAd.getAdContent();
}
return null;
}
@Override
public String getAdCallToAction() {
if (null != mNativeAd) {
mNativeAd.getAdCallToAction();
}
return null;
}
@Override
public float getAppScore() {
if (null != mNativeAd) {
mNativeAd.getAdStarRating();
}
return 4;
}
@Override
public int getAppCommentNum() {
if (null != mNativeAd) {
// TODO
}
return 0;
}
@Override
public int getAppSize() {
if (null != mNativeAd) {
// TODO
}
return 0;
}
@Override
public String getAdVideoCoverImage() {
if (null != mNativeAd) {
// TODO
}
return null;
}
@Override
public void registerViewForInteraction(ViewGroup container, List<View> clickViews, final ADListener.InteractionListener listener) {
LogHelper.d(TAG, "-----register view -----:" + mNativeAd.getAdTitle());
if (null != mNativeAd) {
int channelType = mNativeAd.getAdChannelType();
Object dataObj = mNativeAd.getOrgAdData();
// 处理csj的点击注册
if (ZXADType.AD_TYPE_CSJ == channelType) {
if (dataObj instanceof TTNativeAd) {
LogHelper.e(TAG, "-------Register Native Ad is CSJ");
((TTNativeAd) dataObj).registerViewForInteraction(container, clickViews, clickViews, new TTNativeAd.AdInteractionListener() {
@Override
public void onAdClicked(View view, TTNativeAd ttNativeAd) {
if (null != listener && null != view) {
listener.onAdClick(ZXADNative.this);
if (newsEntity != null && newsEntity.getClk_tracking().size() > 0) {
EventUtils.INSTANCE.apiClient(newsEntity.getClk_tracking().get(0));
}
}
}
@Override
public void onAdCreativeClick(View view, TTNativeAd ttNativeAd) {
}
@Override
public void onAdShow(TTNativeAd ttNativeAd) {
if (null != listener) {
listener.onAdExposed(ZXADNative.this);
}
if (newsEntity != null && newsEntity.getImp_tracking().size() > 0) {
EventUtils.INSTANCE.apiClient(newsEntity.getImp_tracking().get(0));
}
}
});
}
// else if (dataObj instanceof KsNativeAd) {
// LogHelper.e(TAG, "-------Register Native Ad is KUS");
// ((KsNativeAd) dataObj).registerViewForInteraction(container, clickViews, new KsNativeAd.AdInteractionListener() {
// @Override
// public void onAdClicked(View view, KsNativeAd ksNativeAd) {
// if (null != listener && null != view) {
// listener.onAdClick(ZXNativeAd.this);
// }
// }
//
// @Override
// public void onAdShow(KsNativeAd ksNativeAd) {
// if (null != listener) {
// listener.onAdExposed(ZXNativeAd.this);
// }
// }
// });
// }
else if (dataObj instanceof NativeUnifiedADData) {
LogHelper.e(TAG, "-------Register Native Ad is GDT");
NativeAdContainer containeraa = new NativeAdContainer(mContext);
container.addView(container);
((NativeUnifiedADData) dataObj).bindAdToView(mContext, containeraa, null, clickViews);
}
}
} else {
LogHelper.e(TAG, "Native Ad is Null");
}
}
@Override
public void registerViewForInteraction(ViewGroup container, View view, List<View> clickViews, ADListener.InteractionListener listener) {
}
@Override
public String getSource() {
return mNativeAd.getAdSource();
}
@Override
public String getAdIconUrl() {
return mNativeAd.getAdIconUrl();
}
@Override
public List<String> getImageList() {
return mNativeAd.getAdImageUrl();
}
@Override
public String getAppIconUrl() {
return mNativeAd.getAdIconUrl();
}
private ADListener.NativeLoadListener EMPTY_LISTENER = new ADListener.NativeLoadListener() {
@Override
public void onAdLoaded(NativeADWrapper nativeAd) {
if (null != nativeAd) {
mNativeAd = nativeAd;
if (null != mLoadListener) {
mLoadListener.onAdLoaded(ZXADNative.this);
}
}
}
@Override
public void onAdFailed(AdError error) {
if (null != mLoadListener) {
mLoadListener.onAdFailed(error);
}
}
};
}
package com.ym.library.config;
import android.content.Context;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.os.Process;
import com.ym.library.csj.NativeCSJCache;
import com.ym.library.gdt.NativeGDTCache;
import com.ym.library.listener.ADListener;
import com.ym.library.module.NewsEntity;
import com.ym.library.utils.LogHelper;
import com.ym.library.utils.ThreadUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
public class ZXADRequestController implements Handler.Callback {
private static final String TAG = ZXADRequestController.class.getSimpleName();
private Context mContext;
private ZXAdSlot zxAdSlot;
private NewsEntity newsEntity;
// 广告位下的多渠道配置对象
// private PriorityPolicy mConfig;
// 渠道名列表
private List<String> mChannelNames = Collections.synchronizedList(new ArrayList<String>());
// 错误的渠道
private List<String> mErrorNames = Collections.synchronizedList(new ArrayList<String>());
// 渠道缓存队列
private ConcurrentHashMap<String, BaseChannel> mChannelCaches = new ConcurrentHashMap<>();
private long mTotalTime = 3000;
private Handler mHandler;
// 标记是否在load过程中
private boolean isLoading = false;
// 是否被意外取消(主要是destroy后无法通知异步)
private volatile boolean isCancel;
private static final int MSG_START_SCAN = 100;
private static final int MSG_TIME_OUT = 101;
private ADListener.NativeLoadListener mListener;
public ZXADRequestController(Context context, NewsEntity newsEntity, ZXAdSlot zxAdSlot) {
mContext = context;
this.zxAdSlot = zxAdSlot;
switch (newsEntity.getPlatformId()) {
case 1:
mChannelCaches.put(String.valueOf(newsEntity.getPlatformId()), new NativeCSJCache(context, 0, 1, 0, zxAdSlot));
mChannelNames.add(String.valueOf(newsEntity.getPlatformId()));
break;
case 2:
mChannelCaches.put(String.valueOf(newsEntity.getPlatformId()), new NativeGDTCache(context, 0, 1, 0, zxAdSlot));
mChannelNames.add(String.valueOf(newsEntity.getPlatformId()));
break;
}
this.newsEntity = newsEntity;
HandlerThread thread = new HandlerThread("adRequest", Process.THREAD_PRIORITY_BACKGROUND);
thread.start();
mHandler = new Handler(thread.getLooper(), this);
}
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case MSG_START_SCAN:
mHandler.removeMessages(MSG_START_SCAN);
LogHelper.d(TAG, "handle MSG SCAN ~");
scanResult();
break;
case MSG_TIME_OUT:
mHandler.removeMessages(MSG_TIME_OUT);
LogHelper.d(TAG, "handle MSG TIME OUT ~");
break;
default:
break;
}
return false;
}
/**
* 同步的方式获取一个广告
*
* @return
*/
public NativeADWrapper getAd() {
NativeADWrapper adWrapper = null;
synchronized (newsEntity) {
for (String channel : mChannelNames) {
BaseChannel cache = mChannelCaches.get(channel);
if (null != cache && cache.getCacheSize() > 0) {
adWrapper = cache.doGetAD();
break;
} else {
continue;
}
}
}
return adWrapper;
}
/**
* 动态传入loadListener
*
* @param listener
*/
public void setLoadListener(ADListener.NativeLoadListener listener) {
mListener = listener;
}
/**
* 异步的方式获取一个广告
*/
public void loadAd() {
if (isLoading) {
LogHelper.d(TAG, "already do load ");
return;
}
mHandler.sendEmptyMessage(MSG_START_SCAN);
isCancel = false;
scanResult();
}
private void scanResult() {
LogHelper.d(TAG, "scanResult start ----");
long startTime = System.currentTimeMillis();
boolean isReturn = false;
long time_interval;
while (!isReturn) {
isLoading = true;
Iterator<String> iterator = mChannelNames.iterator();
while (iterator.hasNext()) {
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
String name = iterator.next();
if (isCancel) {
ThreadUtils.runOnUIT(new Runnable() {
@Override
public void run() {
mListener.onAdFailed(AdError.NO_FILL);
}
});
isReturn = true;
LogHelper.d(TAG, "Current Action Has Been Canceled :" + name);
break;
}
time_interval = System.currentTimeMillis() - startTime;
if (time_interval > mTotalTime) {
LogHelper.d(TAG, "超时了,退出");
ThreadUtils.runOnUIT(new Runnable() {
@Override
public void run() {
mListener.onAdFailed(AdError.TIME_OUT_ERROR);
}
});
isReturn = true;
break;
}
if (mErrorNames.contains(name)) {
LogHelper.d(TAG, "当前渠道已错误,跳过 :" + name);
continue;
}
if (null == mChannelCaches.get(name)) {
LogHelper.d(TAG, "没有渠道 :" + name + ", 跳过");
continue;
}
BaseChannel channel = mChannelCaches.get(name);
if (!channel.isError) {
LogHelper.d(TAG, "channel 正常,尝试取ad :" + name);
if (canReturn(name, time_interval)) {
if (channel.getCacheSize() > 0) {
final NativeADWrapper ad = channel.doGetAD();
LogHelper.d(TAG, "渠道" + channel + "返回了," + ad.getAdTitle());
ThreadUtils.runOnUIT(new Runnable() {
@Override
public void run() {
mListener.onAdLoaded(ad);
}
});
isReturn = true;
break;
} else {
if (!channel.isRefreshing) {
channel.doLoadAd();
LogHelper.d(TAG, "当前渠道需要刷新 :" + name);
}
}
}
} else {
LogHelper.d(TAG, "channel Error,加入错误列表 :" + name);
// resetChannelWT(name);
if (!mErrorNames.contains(name)) {
mErrorNames.add(name);
}
if (mErrorNames.size() == mChannelNames.size()) {
LogHelper.d(TAG, "所有渠道都错误了 ! NO_FILL");
ThreadUtils.runOnUIT(new Runnable() {
@Override
public void run() {
mListener.onAdFailed(AdError.NO_FILL);
}
});
isReturn = true;
break;
}
}
}
}
isLoading = false;
LogHelper.d(TAG, "scanResult End ----");
}
private boolean canReturn(String name, long currT) {
boolean can = false;
BaseChannel channel = mChannelCaches.get(name);
if (null == channel) {
can = false;
}
long startTime = channel.mStartTime;
if (startTime <= currT && currT <= mTotalTime) {
can = true;
}
LogHelper.d(TAG, "canReturn 渠道 :" + name + ", startT :" + startTime + ", 总时长 :" + mTotalTime + ", 当前时间:" + currT + ", returnResult :" + can);
return can;
}
/**
* 内部监听,主要用来监听各个渠道缓存的状态
*/
private InnerCallBack.AdLoadCallback mLoadCallBack = new InnerCallBack.AdLoadCallback() {
@Override
public void onAdLoaded(BaseChannel whichChannel) {
if (mChannelCaches.contains(whichChannel)) {
mChannelCaches.get(whichChannel).isRefreshing = false;
mChannelCaches.get(whichChannel).isError = false;
}
}
@Override
public void onAdError(BaseChannel whichChannel, AdError error) {
if (mChannelCaches.contains(whichChannel)) {
mChannelCaches.get(whichChannel).isRefreshing = false;
mChannelCaches.get(whichChannel).isError = true;
}
}
};
private ADListener.NativeLoadListener EMPTY_CALLBACK = new ADListener.NativeLoadListener() {
@Override
public void onAdLoaded(NativeADWrapper nativeAd) {
LogHelper.e(TAG, "EMPTY CALLBACK ~ onAdLoaded");
}
@Override
public void onAdFailed(AdError error) {
LogHelper.e(TAG, "EMPTY CALLBACK ~ onAdFailed");
}
};
}
package com.ym.library.config
object ZXADType {
// start=====================================================================
// 1. 穿山甲 2.广点通 3. 快手 4. 搜狗 5.科大讯飞
/**
* 新
* 1001 chuanshanjia 穿山甲 1
1002 kuaishou 快手 1
1003 guangdiantong 广点通 1
1004 youliangbao 优量宝 1
*/
const val PLANTFORM_AD_TT = "chuanshanjia" //穿山甲
const val PLANTFORM_AD_GDT = "guangdiantong" //广点通
const val PLANTFORM_AD_KUS = "kuaishou" //快手
const val PLANTFORM_SH_YLB = "youliangbao"//优量宝
const val PLANTFORM_AD_SIGNMOB = "sigmob" //sign Mob
const val PLANTFORM_AD_BD = "baidu" //百度
const val PLANTFORM_AD_SH = "shanhu"//珊瑚
const val PLANTFORM_AD_RS = "ruishi"//瑞狮
const val PLANTFORM_AD_SG = 4 //搜狗
const val PLANTFORM_AD_KDXF = 5 //科大讯飞
// =====================================================================stop
// 广告内容模式
// 大图
const val AD_MODE_BIGIMAGE = 1
// 小图
const val AD_MODE_SMALLIMG = 2
// 多图
const val AD_MODE_MOREIMG = 3
// 图文
const val AD_MODE_WORDSIMG = 4
// 视频
const val AD_MODE_VIDEO = 5
// 渠道类型
const val AD_TYPE_CSJ = 11
const val AD_TYPE_GDT = 12
const val AD_TYPE_BAI = 13
const val AD_TYPE_SEL = 14
const val AD_TYPE_KUS = 15
// 渠道名定义
const val AD_CHANNEL_CSJ = "csj"
const val AD_CHANNEL_GDT = "gdt"
const val AD_CHANNEL_BAI = "bai"
const val AD_CHANNEL_SEL = "sel"
const val AD_CHANNEL_KUS = "kus"
// 渠道ADID
const val AD_ID_CSJ = "1101"
const val AD_ID_GDT = "1102"
const val AD_ID_BAI = "1103"
const val AD_ID_SEL = "1104"
const val AD_ID_KUS = "1105"
}
\ No newline at end of file
package com.ym.library.config;
public class ZXAdSlot {
public String codeID;
public boolean isSupportDeeplink;
// public boolean isAutoPlay;
// public long imgSize;
// public int slotType;
// public int adSize;
public int count;
public ZXADSizeConfig sizeConfig;
}
package com.ym.library.config;
import android.content.Context;
import android.util.SparseArray;
import com.ym.library.module.NewsEntity;
public class ZXPullRequestInstance {
private static ZXPullRequestInstance sInstance;
private Context mContext;
private SparseArray<ZXADRequestController> mControllerMap = new SparseArray<>();
public static ZXPullRequestInstance getInstance(Context context) {
if (null == sInstance) {
synchronized (ZXPullRequestInstance.class) {
if (null == sInstance) {
sInstance = new ZXPullRequestInstance(context);
}
}
}
return sInstance;
}
public ZXADRequestController getAdController(NewsEntity newsEntity, ZXAdSlot zxAdSlot) {
if (null != mControllerMap.get(newsEntity.getPlatformId())) {
return mControllerMap.get(newsEntity.getPlatformId());
}
ZXADRequestController controller = new ZXADRequestController(mContext, newsEntity,zxAdSlot);
mControllerMap.put(newsEntity.getPlatformId(), controller);
return controller;
}
private ZXPullRequestInstance(Context context) {
mContext = context;
}
}
package com.ym.library.csj;
import android.graphics.Bitmap;
import com.bytedance.sdk.openadsdk.TTImage;
import com.bytedance.sdk.openadsdk.TTNativeAd;
import com.ym.library.config.NativeADWrapper;
import com.ym.library.config.ZXADConfig;
import com.ym.library.config.ZXADType;
import java.util.ArrayList;
import java.util.List;
public class NativeAdForCSJ implements NativeADWrapper {
TTNativeAd mTTNative;
private long mStartTime;
private long VALID_TIME = 30 * 60 * 1000;// 有效时间30Min
NativeAdForCSJ(TTNativeAd ttNativeAd) {
mTTNative = ttNativeAd;
mStartTime = System.currentTimeMillis();
}
@Override
public String getAdId() {
return ZXADType.AD_ID_CSJ;
}
@Override
public List<String> getAdImageUrl() {
return convertImage(mTTNative.getImageList());
}
@Override
public String getAdIconUrl() {
return convertImage(mTTNative.getIcon());
}
@Override
public String getAdContent() {
return mTTNative.getDescription();
}
@Override
public String getAdCallToAction() {
// 没有对应返回
return null;
}
@Override
public String getAdTitle() {
return mTTNative.getTitle();
}
@Override
public float getAdStarRating() {
return mTTNative.getAppScore();
}
@Override
public String getAdSource() {
return mTTNative.getSource();
}
@Override
public boolean isValid() {
return (System.currentTimeMillis() - mStartTime) < VALID_TIME;
}
@Override
public int getAdMaterialType() {
return convertMode(mTTNative.getImageMode());
}
@Override
public int getAdActionType() {
return mTTNative.getInteractionType();
}
@Override
public Bitmap getSDKLogo() {
return mTTNative.getAdLogo();
}
@Override
public void destroy() {
mTTNative = null;
}
@Override
public int getAdChannelType() {
return ZXADType.AD_TYPE_CSJ;
}
@Override
public String getAdChannelName() {
return ZXADType.AD_CHANNEL_CSJ;
}
@Override
public Object getOrgAdData() {
return mTTNative;
}
/**
* Image<>imageUrl的转化
*
* @param image
* @return
*/
String convertImage(TTImage image) {
if (null != image) {
return image.getImageUrl();
}
return "";
}
List<String> convertImage(List<TTImage> ttImageList) {
List<String> images = new ArrayList<>();
if (null != ttImageList) {
for (TTImage img : ttImageList) {
images.add(convertImage(img));
}
}
return images;
}
/**
* 广告内容模式转化
*
* @param mode
* @return
*/
int convertMode(int mode) {
int type = -1;
if (2 == mode) {
type = ZXADType.AD_MODE_BIGIMAGE;
}
switch (mode) {
case 3:
type = ZXADType.AD_MODE_BIGIMAGE;
break;
case 2:
type = ZXADType.AD_MODE_SMALLIMG;
break;
case 4:
type = ZXADType.AD_MODE_MOREIMG;
break;
case 5:
type = ZXADType.AD_MODE_VIDEO;
break;
default:
break;
}
return type;
}
}
package com.ym.library.csj;
import android.content.Context;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import com.bytedance.sdk.openadsdk.AdSlot;
import com.bytedance.sdk.openadsdk.TTAdNative;
import com.bytedance.sdk.openadsdk.TTAdSdk;
import com.bytedance.sdk.openadsdk.TTNativeAd;
import com.ym.library.config.BaseChannel;
import com.ym.library.config.NativeADWrapper;
import com.ym.library.config.ZXAdSlot;
import com.ym.library.utils.LogHelper;
import java.util.List;
public class NativeCSJCache extends BaseChannel implements TTAdNative.NativeAdListener, Handler.Callback {
private String TAG = NativeAdForCSJ.class.getSimpleName();
private TTAdNative mTTAdNative;
private ZXAdSlot zxAdSlot;
public NativeCSJCache(Context context, int sid, int cacheSize, long wt, ZXAdSlot zxAdSlot) {
super(context, sid, cacheSize, wt);
// mSlot = slot; // TODO read adSlot
HandlerThread thread = new HandlerThread("T-csj");
thread.start();
mPullHandler = new Handler(thread.getLooper(), this);
this.zxAdSlot =zxAdSlot;
// TTAdConfig config = new TTAdConfig.Builder()
// .appId("5035966")
// .appName("com.ym.step")
// .debug(true)
// .build();
// TTAdSdk.init(context, config);
// TTAdSdk.init(mContext, new TTAdConfig.Builder()
// // .appId("5001121")
// .appId("5035966").useTextureView(true) //使用TextureView控件播放视频,默认为SurfaceView,当有SurfaceView冲突的场景,可以使用TextureView
// .appName("com.ym.step").titleBarTheme(TTAdConstant.TITLE_BAR_THEME_DARK).allowShowNotify(true) //是否允许sdk展示通知栏提示
// .allowShowPageWhenScreenLock(true) //是否在锁屏场景支持展示广告落地页
// .debug(true) //测试阶段打开,可以通过日志排查问题,上线时去除该调用
// .directDownloadNetworkType(TTAdConstant.NETWORK_STATE_WIFI, TTAdConstant.NETWORK_STATE_3G) //允许直接下载的网络状态集合
// .supportMultiProcess(true)//是否支持多进程
// // .needClearTaskReset()
// //.httpStack(new MyOkStack3())//自定义网络库,demo中给出了okhttp3版本的样例,其余请自行开发或者咨询工作人员。
// .build());
doInit(mContext);
}
@Override
public NativeADWrapper doGetAD() {
return super.doGetAD();
}
@Override
public void doInit(Context context) {
mTTAdNative = TTAdSdk.getAdManager().createAdNative(mContext);
}
@Override
public void doLoadAd() {
if (!isRefreshing) {
if (getCacheSize() < mCacheSize) {
isRefreshing = true;
LogHelper.d(TAG, "CSJCache do refreshing");
AdSlot slot = new AdSlot.Builder()
.setCodeId(zxAdSlot.codeID)
.setSupportDeepLink(true)
.setNativeAdType(AdSlot.TYPE_FEED) //请求原生广告时候,请务必调用该方法,设置参数为TYPE_BANNER或TYPE_INTERACTION_AD
// .setExpressViewAcceptedSize(1024,680)
.setImageAcceptedSize(zxAdSlot.sizeConfig.getWidth(), zxAdSlot.sizeConfig.getHeight())
.setAdCount(zxAdSlot.count)
.build();
mTTAdNative.loadNativeAd(slot, this);
LogHelper.d(TAG, "CSJ cache start refreshing");
} else {
LogHelper.d(TAG, "no need refresh ! getValidCount :" + getCacheSize());
}
} else {
LogHelper.d(TAG, "CSJ cache Already refreshing");
}
}
@Override
public int getCacheSize() {
int count = 0;
for (NativeADWrapper c : mCacheList) {
if (c.isValid()) {
count++;
} else {
mCacheList.remove(c);
}
}
LogHelper.d(TAG, "getCacheSize :" + count);
return count;
}
@Override
public void doClear() {
LogHelper.d(TAG, "Do Clear ~");
mCacheList.clear();
}
@Override
public void doDestroy() {
LogHelper.d(TAG, "Do Destroy ~");
mContext = null;
mCacheList = null;
}
@Override
public void onError(int i, String s) {
LogHelper.d(TAG, "load error :" + i + ", msg: " + s);
isRefreshing = false;
isError = true;
}
@Override
public void onNativeAdLoad(List<TTNativeAd> list) {
LogHelper.d(TAG, "load success ~ Total Count :" + list.size());
isRefreshing = false;
isError = false;
if (null != list) {
for (TTNativeAd t : list) {
LogHelper.d(TAG, "Ad Loaded : " + t.getTitle());
mCacheList.add(new NativeAdForCSJ(t));
if (mCacheList.size() == mCacheSize) {
break;
}
}
}
}
@Override
public boolean handleMessage(Message msg) {
return false;
}
}
This diff is collapsed.
......@@ -8,13 +8,12 @@ import android.os.Build
import android.os.Environment
import android.text.TextUtils
import android.util.Log
import com.google.gson.annotations.Until
import com.ym.library.AppliContext
import com.ym.library.Constant
import com.ym.library.module.VersionEntity
import com.ym.library.net.BaseObserver
import com.ym.library.net.RxSchedulers
import com.ym.library.utils.PhoneUtils
import com.ym.modulecommon.utils.PhoneUtils
import com.ym.library.utils.SettingPreference
import com.ym.library.utils.Utils
import com.ym.library.widget.LoadingDialog
......
......@@ -2,10 +2,9 @@ package com.ym.library.down
import com.ym.library.Constant
import com.ym.library.net.IUserApi
import com.ym.library.net.NetConfig
import com.ym.library.utils.LogUtils
import com.ym.library.utils.PhoneUtils
import com.ym.library.utils.SettingPreference
import com.ym.modulecommon.net.NetConfig
import com.ym.modulecommon.utils.PhoneUtils
import okhttp3.Interceptor
import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
......@@ -40,9 +39,9 @@ object VersionClient {
// builder.addHeader("User-Agent", SettingPreference.getUserAgent())
// }
// if (request.url().host().toString().contains("zhangxinhulian.com")) {
builder.addHeader(Constant.aid, SettingPreference.getAndroidId())
builder.addHeader(Constant.aid, com.ym.modulecommon.utils.SettingPreference.getAndroidId())
LogUtils.e(SettingPreference.getAndroidId())
LogUtils.e(com.ym.modulecommon.utils.SettingPreference.getAndroidId())
// }
chain.proceed(builder.build())
}
......
This diff is collapsed.
package com.ym.library.gdt;
import android.graphics.Bitmap;
import com.qq.e.ads.nativ.NativeUnifiedADData;
import com.ym.library.config.NativeADWrapper;
import com.ym.library.config.ZXADType;
import java.util.List;
public class NativeAdForGDT implements NativeADWrapper {
private NativeUnifiedADData gdtnative;
private long createTime;
private long DEFAULT_INTERVAL_TIME = 30 * 60 * 1000;
public NativeAdForGDT(NativeUnifiedADData ad) {
gdtnative = ad;
createTime = System.currentTimeMillis();
}
@Override
public String getAdId() {
return ZXADType.AD_ID_GDT;
}
@Override
public List<String> getAdImageUrl() {
return gdtnative.getImgList();
}
@Override
public String getAdIconUrl() {
return gdtnative.getIconUrl();
}
@Override
public String getAdContent() {
return gdtnative.getDesc();
}
@Override
public String getAdCallToAction() {
return gdtnative.getCTAText();
}
@Override
public String getAdTitle() {
return gdtnative.getTitle();
}
@Override
public float getAdStarRating() {
return gdtnative.getAppScore();
}
@Override
public String getAdSource() {
return ZXADType.AD_CHANNEL_GDT;
}
@Override
public boolean isValid() {
return (System.currentTimeMillis() - createTime) < DEFAULT_INTERVAL_TIME;
}
@Override
public int getAdMaterialType() {
return 0;
}
@Override
public int getAdActionType() {
return 0;
}
@Override
public Bitmap getSDKLogo() {
return null;
}
@Override
public void destroy() {
}
@Override
public int getAdChannelType() {
return 0;
}
@Override
public String getAdChannelName() {
return ZXADType.AD_CHANNEL_GDT;
}
@Override
public Object getOrgAdData() {
return gdtnative;
}
}
package com.ym.library.gdt;
import android.content.Context;
import com.qq.e.ads.nativ.NativeADUnifiedListener;
import com.qq.e.ads.nativ.NativeUnifiedAD;
import com.qq.e.ads.nativ.NativeUnifiedADData;
import com.qq.e.comm.util.AdError;
import com.ym.library.config.BaseChannel;
import com.ym.library.config.NativeADWrapper;
import com.ym.library.config.ZXAdSlot;
import com.ym.library.utils.LogHelper;
import java.util.List;
public class NativeGDTCache extends BaseChannel implements NativeADUnifiedListener {
private static final String TAG = NativeGDTCache.class.getSimpleName();
private NativeUnifiedADData mAdData;
private NativeUnifiedAD mAdManager;
// private String appId = "1110064402";
// private String posId = "7051204269378351";
public NativeGDTCache(Context context, int sid, int cacheSize, long wt, ZXAdSlot zxAdSlot) {
super(context, sid, cacheSize, wt);
// mAdManager = new NativeUnifiedAD(context, appId, posId, this);
mAdManager = new NativeUnifiedAD(context, zxAdSlot.codeID, this);
}
@Override
public NativeADWrapper doGetAD() {
return super.doGetAD();
}
@Override
public void doInit(Context context) {
}
@Override
public void doLoadAd() {
if (!isRefreshing) {
if (getCacheSize() < mCacheSize) {
isRefreshing = true;
mAdManager.loadData(mCacheSize);
LogHelper.d(TAG, "GDT start refreshing");
} else {
LogHelper.d(TAG, "GDT no need refresh ! getValidCount :" + getCacheSize());
}
} else {
LogHelper.d(TAG, "GDT cache Already refreshing");
}
}
@Override
public int getCacheSize() {
int valid = 0;
for (NativeADWrapper ad : mCacheList) {
if (ad.isValid()) {
valid++;
}
}
LogHelper.d(TAG, "GDT getCacheSize :" + valid);
return valid;
}
@Override
public void doClear() {
synchronized (mCacheList) {
mCacheList.clear();
}
}
@Override
public void doDestroy() {
}
@Override
public void onADLoaded(List<NativeUnifiedADData> list) {
LogHelper.d(TAG, "GDT Cache load Success" + list.size() + list.get(0).getTitle());
isRefreshing = false;
isError = false;
for (NativeUnifiedADData ad : list) {
mCacheList.add(new NativeAdForGDT(ad));
}
}
@Override
public void onNoAD(AdError adError) {
isRefreshing = false;
isError = true;
LogHelper.d(TAG, "GDT Cache load Error: code = " + adError.getErrorCode() + ", msg = " + adError.getErrorMsg());
}
}
This diff is collapsed.
package com.ym.library.listener;
import android.view.View;
import com.ym.library.config.AdError;
import com.ym.library.config.NativeADWrapper;
import com.ym.library.config.NativeDataAD;
public interface ADListener {
// // 广告返回
// void onAdLoaded(ZXNativeAd ad);
//
// // 广告失败
// void onAdError(AdError error);
//
// // 广告展示
// void onAdImpression();
//
// // 广告点击
// void onAdClick(ZXNativeAd ad);
//
// // 创意点击
// void onAdCreativeClick(View view, ZXNativeAd ad);
/**
* 广告拉取监听回调
*/
interface NativeLoadListener {
void onAdLoaded(NativeADWrapper nativeAd);
void onAdFailed(AdError error);
}
interface NativeNetListener {
void onAdLoaded(NativeDataAD nativeData);
void onAdFailed(AdError error);
}
/**
* 广告view注册监听回调
*/
interface InteractionListener {
void onAdExposed(NativeDataAD ad);
void onAdClick(NativeDataAD ad);
}
interface DownloadStatusListener {
}
}
package com.ym.admodule.listener
import com.bytedance.sdk.openadsdk.TTDrawFeedAd
import com.bytedance.sdk.openadsdk.TTNativeExpressAd
interface ZXADDrawListener {
fun onSuccess()//自己服务器成功
fun onFail()//自己服务器失败
fun onDrawFeedAdLoad(ttDrawFeedAd: TTDrawFeedAd)//有视频的情况下
fun onError()//没有视频的情况下
fun onNativeExpressAdLoad(ttNativeExpressAd: TTNativeExpressAd)//个性化视频在这里
}
\ No newline at end of file
package com.ym.library.listener
import com.bytedance.sdk.openadsdk.TTSplashAd
import com.ym.library.module.NewsEntity
interface ZXADSplashListener {
//获取广告成功 (自己服务器)
fun onSuccessResult()
//获取广告失败(自己服务器)
fun onFailResult(result:String){}
//获取广告 超时 广告
fun onTimeout(){}
//获取广告 错误 广告
fun onErrorResult(s: String){}
//获取开屏广告 成功 广告
fun onSplashAdLoad(ad: TTSplashAd){}
//获取开屏广告 点击 广告
fun onAdClicked(data: NewsEntity){}
//获取开屏广告 展示 广告
fun onAdShow(data: NewsEntity){}
//获取开屏广告 跳过 广告
fun onAdSkip(){}
//获取开屏广告 结束 广告
fun onAdTimeOver(){}
}
\ No newline at end of file
package com.ym.library.listener
import com.qq.e.ads.rewardvideo.RewardVideoAD
import com.ym.library.config.ZXADRewardVideo
import com.ym.library.module.NewsEntity
interface ZXADVideoListener {
fun onFail()
fun onSuccess()
fun onError()
fun onRewardVideoCached()
fun setRewardAdInteractionListener()
fun onRewardVerify()
fun onVideoError()
fun onRewardVideoAdLoad()
fun onAdShow()
fun onAdVideoBarClick(newsEntity: NewsEntity)
fun onAdClose()
fun onVideoComplete()
fun onSkippedVideo()
fun onFullScreenVideoCached()
fun onRewardVideoAdLoad(newsEntity: NewsEntity)
fun onLoadVideoAd(rewardVideoAD: ZXADRewardVideo)
}
\ No newline at end of file
......@@ -2,8 +2,9 @@ package com.ym.library.net
import android.text.TextUtils
import com.ym.library.Constant
import com.ym.library.utils.PhoneUtils
import com.ym.modulecommon.utils.PhoneUtils
import com.ym.library.utils.SettingPreference
import com.ym.modulecommon.net.NetConfig
import okhttp3.Interceptor
import okhttp3.Request
import okhttp3.logging.HttpLoggingInterceptor
......@@ -24,7 +25,7 @@ object ApiClient {
if (request.url().toString().contains("yilan")) {
chain.proceed(request.newBuilder().build())
} else {
PhoneUtils.addParam(request, builder)
com.ym.modulecommon.utils.PhoneUtils.addParam(request, builder)
chain.proceed(request.newBuilder().url(builder.build()).build())
}
}
......@@ -32,12 +33,12 @@ object ApiClient {
private val headInterceptor = Interceptor { chain ->
val request = chain.request()
val builder = request.newBuilder()
builder.addHeader(Constant.aid, SettingPreference.getAndroidId())
builder.addHeader(Constant.Device.env, Constant.Param.env)
if (!TextUtils.isEmpty(SettingPreference.getUserAgent())) {
builder.addHeader("web-user-agent", SettingPreference.getUserAgent())
builder.addHeader(Constant.aid, com.ym.modulecommon.utils.SettingPreference.getAndroidId())
builder.addHeader(Constant.Device.env, com.ym.modulecommon.Constant.param.env)
if (!TextUtils.isEmpty(com.ym.modulecommon.utils.SettingPreference.getUserAgent())) {
builder.addHeader("web-user-agent", com.ym.modulecommon.utils.SettingPreference.getUserAgent())
builder.removeHeader("User-Agent")
builder.addHeader("User-Agent", SettingPreference.getUserAgent())
builder.addHeader("User-Agent", com.ym.modulecommon.utils.SettingPreference.getUserAgent())
}
val headers: Request = builder.build()
chain.proceed(headers)
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment