Commit d1c7c08b authored by wangxuewei's avatar wangxuewei

[提交人]:王雪伟

[提交简述] :幸福农场
[实现方案] :广告提交
parent 30162e14
......@@ -87,6 +87,7 @@ android {
}
productFlavors {
toutiao{}
guanwang {}
_360 {}
xiaomi {}
......
......@@ -3,7 +3,6 @@
xmlns:tools="http://schemas.android.com/tools"
package="com.ym.xync">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
......
......@@ -6,9 +6,11 @@ import android.view.View
import android.widget.FrameLayout
import android.widget.TextView
import androidx.core.app.ActivityCompat
import com.bytedance.sdk.openadsdk.TTSplashAd
import com.gyf.immersionbar.BarHide
import com.gyf.immersionbar.ImmersionBar
import com.umeng.analytics.MobclickAgent
import com.ym.library.utils.ADConfig
import com.ym.game.GameActivity
import com.ym.xync.R
import com.ym.library.Constant
......@@ -23,6 +25,9 @@ import com.ym.library.utils.ReportUtils
import com.ym.library.utils.SettingPreference
import com.ym.library.utils.Utils
import com.ym.game.utils.CenterDialog
import com.ym.library.config.AdManager
import com.ym.library.listener.ZXADSplashListener
import com.ym.library.module.NewsEntity
class SplashActivity : BaseActivity(), SplashContract.View {
......@@ -65,55 +70,54 @@ class SplashActivity : BaseActivity(), SplashContract.View {
override fun jumpPage() {
Log.d("wxw","jump")
startMain()
//TODO 加载开屏广告
// if (!SettingPreference.getIsShowGuide()) {
// Log.d("wxw","jump2")
// EventUtils.onEvent("SplashActivity_loadSplash")
// loadSplash(
// this,
// splash_container!!,
// tv_skipview!!,
// object : ToponSplashListener {
// override fun onAdShow(p0: ATAdInfo) {
// EventUtils.onEvent("SplashActivity_loadSplash_onAdShow")
// EventUtils.onEvent(
// "ad_show",
// Utils.obj2Str(AdEntity(p0.networkFirmId.toString(), AdID.mPlacementId_splash_base, "开屏"))
// )
// }
//
// override fun onAdDismiss() {
// startMain()
// }
//
// override fun onAdSkipe() {
// EventUtils.onEvent("SplashActivity_loadSplash_onAdSkipe")
// startMain()
// }
//
// override fun onNoAdError() {
// EventUtils.onEvent("SplashActivity_loadSplash_onNoAdError")
// startMain()
// }
//
// override fun onAdClick(p0: ATAdInfo) {
// EventUtils.onEvent("SplashActivity_loadSplash_onAdClick")
// EventUtils.onEvent(
// "ad_click",
// Utils.obj2Str(AdEntity(p0.networkFirmId.toString(), AdID.mPlacementId_splash_base, "开屏"))
// )
// }
//
// override fun onAdLoaded() {
// }
// },
// AdID.mPlacementId_splash_luck_farm
// //TODO TestAdID
// )
// } else {
// startMain()
// }
if (!SettingPreference.getIsShowGuide()) {
EventUtils.onEvent("SplashActivity_loadSplash")
AdManager.loadSplashAd(this,
ADConfig.AD_SPLASH, tv_skipview, splash_container!!,object : ZXADSplashListener {
override fun 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) {}
override fun onAdShow(data: NewsEntity) {}
override fun onAdSkip() {
Log.e("huang", "onAdSkip()")
startMain()
}
override fun onAdTimeOver() {
Log.e("huang", "onAdTimeOver()")
startMain()
}
})
} else {
startMain()
}
}
private var startTime = 0L
......
......@@ -17,6 +17,8 @@ import com.umeng.socialize.PlatformConfig
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 java.io.BufferedReader
import java.io.FileReader
......@@ -32,25 +34,23 @@ class BaseApplication : MultiDexApplication() {
NetConfig.setBase_Url(NetConfig.Environment.PRODUCT)// TODO 上线之后提成成 NetConfig.Environment.PRODUCT
Constant.appLs = "5ea353dac826a125 "//appls
// //步行多多 广告id
// AdManager.init(this, ZXADConfig.csjId("5104663").gdtId("1110912313").Build());
//彩蛋消消乐 广告id
/*AdManager.init(
AdManager.init(//TODO 替换id
this, ZXADConfig
.csjId("5082476")
.gdtId("1110685570")
.bdId("ba584026")
.signMob("5105", "9d597f774eb14956")
.csjId("5113760")
.gdtId("1111127526")
// .bdId("ba584026")
// .signMob("5105", "9d597f774eb14956")
.ksId("533500009")
.ylbId("10000160")
.Build()
);*/
);
//TODO Android 9及以上必须设置 (聚合快手时必须添加)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
val processName = Application.getProcessName()
if (packageName != processName) {
WebView.setDataDirectorySuffix(processName)
}
}
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
// val processName = Application.getProcessName()
// if (packageName != processName) {
// WebView.setDataDirectorySuffix(processName)
// }
// }
UMConfigure.setLogEnabled(true)
UMConfigure.init(this, UMConfigure.DEVICE_TYPE_PHONE, "5f7196f980455950e49a209e")
......
package com.ym.game.netstate;
/**
* @author (wangXuewei)
* @datetime 2020-10-21 14:38 GMT+8
* @detail :
*/
public interface NetStateChangeObserver {
void onNetDisconnected();
void onNetConnected(NetworkType networkType);
}
package com.ym.game.netstate;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import com.ym.library.AppliContext;
import java.util.ArrayList;
import java.util.List;
/**
* @author (wangXuewei)
* @datetime 2020-10-21 14:36 GMT+8
* @detail :
*/
public class NetStateChangeReceiver extends BroadcastReceiver {
private NetworkType mType = NetworkUtil.getNetworkType(AppliContext.get());
private static class InstanceHolder {
private static final NetStateChangeReceiver INSTANCE = new NetStateChangeReceiver();
}
private List<NetStateChangeObserver> mObservers = new ArrayList<>();
@Override
public void onReceive(Context context, Intent intent) {
if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {
NetworkType networkType = NetworkUtil.getNetworkType(context);
notifyObservers(networkType);
}
}
public static void registerReceiver(Context context) {
IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
context.registerReceiver(InstanceHolder.INSTANCE, intentFilter);
}
public static void unRegisterReceiver(Context context) {
context.unregisterReceiver(InstanceHolder.INSTANCE);
}
public static void registerObserver(NetStateChangeObserver observer) {
if (observer == null) {
return;
}
if (!InstanceHolder.INSTANCE.mObservers.contains(observer)) {
InstanceHolder.INSTANCE.mObservers.add(observer);
}
}
public static void unRegisterObserver(NetStateChangeObserver observer) {
if (observer == null) {
return;
}
if (InstanceHolder.INSTANCE.mObservers == null) {
return;
}
InstanceHolder.INSTANCE.mObservers.remove(observer);
}
private void notifyObservers(NetworkType networkType) {
if (mType == networkType) {
return;
}
mType = networkType;
if (networkType == NetworkType.NETWORK_NO) {
for (NetStateChangeObserver observer : mObservers) {
observer.onNetDisconnected();
}
} else {
for (NetStateChangeObserver observer : mObservers) {
observer.onNetConnected(networkType);
}
}
}
}
package com.ym.game.netstate;
/**
* @author (wangXuewei)
* @datetime 2020-10-21 14:34 GMT+8
* @detail :
*/
public enum NetworkType {
NETWORK_WIFI("WiFi"),
NETWORK_4G("4G"),
NETWORK_2G("2G"),
NETWORK_3G("3G"),
NETWORK_UNKNOWN("Unknown"),
NETWORK_NO("No network");
private String desc;
NetworkType(String desc) {
this.desc = desc;
}
@Override
public String toString() {
return desc;
}
}
package com.ym.game.netstate;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.telephony.TelephonyManager;
import androidx.annotation.RequiresPermission;
/**
* @author (wangXuewei)
* @datetime 2020-10-21 14:35 GMT+8
* @detail :
*/
public class NetworkUtil {
private NetworkUtil() {
throw new UnsupportedOperationException("u can't instantiate me...");
}
@RequiresPermission("android.permission.ACCESS_NETWORK_STATE")
private static NetworkInfo getActiveNetworkInfo(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
return cm.getActiveNetworkInfo();
}
/**
* 获取当前网络类型
* 需添加权限 {@code <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>}
*/
@RequiresPermission("android.permission.ACCESS_NETWORK_STATE")
public static NetworkType getNetworkType(Context context) {
NetworkType netType = NetworkType.NETWORK_NO;
NetworkInfo info = getActiveNetworkInfo(context);
if (info != null && info.isAvailable()) {
if (info.getType() == ConnectivityManager.TYPE_WIFI) {
netType = NetworkType.NETWORK_WIFI;
} else if (info.getType() == ConnectivityManager.TYPE_MOBILE) {
switch (info.getSubtype()) {
case TelephonyManager.NETWORK_TYPE_TD_SCDMA:
case TelephonyManager.NETWORK_TYPE_EVDO_A:
case TelephonyManager.NETWORK_TYPE_UMTS:
case TelephonyManager.NETWORK_TYPE_EVDO_0:
case TelephonyManager.NETWORK_TYPE_HSDPA:
case TelephonyManager.NETWORK_TYPE_HSUPA:
case TelephonyManager.NETWORK_TYPE_HSPA:
case TelephonyManager.NETWORK_TYPE_EVDO_B:
case TelephonyManager.NETWORK_TYPE_EHRPD:
case TelephonyManager.NETWORK_TYPE_HSPAP:
netType = NetworkType.NETWORK_3G;
break;
case TelephonyManager.NETWORK_TYPE_LTE:
case TelephonyManager.NETWORK_TYPE_IWLAN:
netType = NetworkType.NETWORK_4G;
break;
case TelephonyManager.NETWORK_TYPE_GSM:
case TelephonyManager.NETWORK_TYPE_GPRS:
case TelephonyManager.NETWORK_TYPE_CDMA:
case TelephonyManager.NETWORK_TYPE_EDGE:
case TelephonyManager.NETWORK_TYPE_1xRTT:
case TelephonyManager.NETWORK_TYPE_IDEN:
netType = NetworkType.NETWORK_2G;
break;
default:
String subtypeName = info.getSubtypeName();
if (subtypeName.equalsIgnoreCase("TD-SCDMA")
|| subtypeName.equalsIgnoreCase("WCDMA")
|| subtypeName.equalsIgnoreCase("CDMA2000")) {
netType = NetworkType.NETWORK_3G;
} else {
netType = NetworkType.NETWORK_UNKNOWN;
}
break;
}
} else {
netType = NetworkType.NETWORK_UNKNOWN;
}
}
return netType;
}
}
package com.ym.game.view
import android.app.Activity
import android.app.Dialog
import android.content.Context
import android.text.Html
......@@ -12,12 +13,18 @@ import android.widget.LinearLayout
import android.widget.TextView
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.bytedance.sdk.openadsdk.TTNativeExpressAd
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.library.utils.Utils
import com.ym.xync.R
......@@ -69,7 +76,7 @@ object MainDialog {
val mDialog = Dialog(context, R.style.UpdateVersionCompatDialogTheme)
val mDialogView =
showBottomDialog(
R.layout.dialog_get_diamand,
R.layout.dialog_get_water_drop,
context,
mDialog,
0,
......@@ -85,7 +92,7 @@ object MainDialog {
val llcontent3 = mDialogView?.findViewById<LinearLayout>(R.id.id_ll_content_3)
val ivGetDropBg3 = mDialogView?.findViewById<ImageView>(R.id.iv_get_drop_bg3)
val tvGetDropCount3 = mDialogView?.findViewById<TextView>(R.id.tv_get_drop_count3)
var tvget = mDialogView?.findViewById<TextView>(R.id.id_tv_get)
val tvget = mDialogView?.findViewById<TextView>(R.id.id_tv_gongxi_get)
//3 种子 4 金币 5 加速剂
when (type) {
3 -> {
......@@ -126,7 +133,53 @@ object MainDialog {
}
}
//shwoAd(adType, context, layoutAd)
// shwoAd(adType, context, layoutAd)
AdManager.loadFeedAd(ADConfig.AD_IMG_FADE,(context as Activity), ZXADSizeConfig(Utils.px2dip(PhoneUtils.getScreenWidth(context).toFloat())-20,265), 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()
......@@ -224,7 +277,7 @@ object MainDialog {
val mDialog = Dialog(context, R.style.UpdateVersionCompatDialogTheme)
val mDialogView =
showBottomDialog(
R.layout.dialog_get_diamand,
R.layout.dialog_get_water_drop,
context,
mDialog,
0,
......@@ -241,7 +294,8 @@ object MainDialog {
val llcontent3 = mDialogView?.findViewById<LinearLayout>(R.id.id_ll_content_3)
val ivGetDropBg3 = mDialogView?.findViewById<ImageView>(R.id.iv_get_drop_bg3)
val tvGetDropCount3 = mDialogView?.findViewById<TextView>(R.id.tv_get_drop_count3)
var tvget = mDialogView?.findViewById<TextView>(R.id.id_tv_get)
var tvget = mDialogView?.findViewById<TextView>(R.id.id_tv_gongxi_get)
//3 种子 4 金币 5 加速剂
when (type) {
1 -> {
......@@ -292,6 +346,52 @@ object MainDialog {
mDialog.dismiss()
mListener.onCloseViewSuccess(true)
}
AdManager.loadFeedAd(ADConfig.AD_IMG_FADE,(context as Activity), ZXADSizeConfig(Utils.px2dip(PhoneUtils.getScreenWidth(context).toFloat())-20,265), 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)
......@@ -324,9 +424,11 @@ object MainDialog {
recyList?.adapter = orderListAdapter
recyList?.layoutManager = LinearLayoutManager(context)
orderListAdapter?.appendToList(str2Obj.farmOrderDataList)
val str2 = "完成当前订单将获得<font color=\"#FF9128\"><big><big>${str2Obj.awardCash}</big></big></font>元"
tvtitle.text =Html.fromHtml(str2)
mDialogView.findViewById<TextView>(R.id.id_img_order_list_title).text="未完成${str2Obj.orderLevel}级订单"
val str2 =
"完成当前订单将获得 <font color=\"#FF9128\"><big><big>${str2Obj.awardCash}</big></big></font> 金币"
tvtitle.text = Html.fromHtml(str2)
mDialogView.findViewById<TextView>(R.id.id_img_order_list_title).text =
"未完成${str2Obj.orderLevel}级订单"
}
//shwoAd(adType, context, layoutAd)
......
package com.ym.game.view
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Context
import android.graphics.drawable.ColorDrawable
import android.util.Log
import android.view.*
import android.widget.ImageView
import android.widget.PopupWindow
......@@ -16,13 +18,22 @@ import com.ym.game.adapter.SigninDropsAdapter
import com.ym.game.adapter.WateringTaskAdpater
import com.ym.game.contract.WateringRewardContract
import com.ym.game.module.SinginEntity
import com.ym.game.module.StatusEntity
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
import com.ym.library.rxbus.RxBusConstant
import com.ym.library.rxbus.RxBusUtil
import com.ym.library.rxbus.Subscribe
import com.ym.library.rxbus.ThreadMode
import com.ym.library.utils.ADConfig
import com.ym.library.utils.EventUtils
import com.ym.library.utils.JumpUtils
import com.ym.library.utils.LogUtils
......@@ -115,7 +126,7 @@ class SiginDropsPopupwindow : PopupWindow(), WateringRewardContract.View,
}
4 -> {
EventUtils.onEvent("click_receive_coin_task_video_btn","领金币任务视频")
mPresenter?.getRrchardDailyTask()
// mPresenter?.getRrchardDailyTask()
//看广告
// ToponManager.loadReward(
// (mContext as Activity), object : ToponRewardListener {
......@@ -163,7 +174,70 @@ class SiginDropsPopupwindow : PopupWindow(), WateringRewardContract.View,
// },
// AdID.mPlacementId_Reward_video_luck_farm
// )
AdManager.loadRewardVideoAd(
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() {
getVideoAcceleratorsReceive2();
mPresenter?.getRrchardDailyTask()
}
override fun onVideoComplete() {
}
override fun onSkippedVideo() {
}
override fun onFullScreenVideoCached() {
}
override fun onLoadVideoAd(rewardVideoAD: ZXADRewardVideo) {
}
})
}
}
......@@ -239,5 +313,18 @@ class SiginDropsPopupwindow : PopupWindow(), WateringRewardContract.View,
this.animationStyle = R.style.main_photo_anim
isClippingEnabled = false
}
//看视频领上报
fun getVideoAcceleratorsReceive2() {
GameApiClient.gameApi.adVideoReport()
.compose(RxSchedulers.observableIO2Main())
.subscribe(object : BaseObserver<StatusEntity>() {
override fun onSuccess(result: StatusEntity?) {
Log.d("wxw", "看视频上报 Success")
}
override fun onFailure(e: Throwable?, code: String?, errorMsg: String?) {
Log.d("wxw", "看视频上报 error")
}
})
}
}
\ No newline at end of file
......@@ -5,6 +5,7 @@ import android.app.Activity
import android.app.Dialog
import android.content.Context
import android.os.CountDownTimer
import android.util.Log
import android.view.Gravity
import android.view.MotionEvent
import android.view.View
......@@ -12,12 +13,21 @@ import android.widget.ImageView
import android.widget.TextView
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
import com.ym.library.rxbus.RxBusConstant
import com.ym.library.rxbus.RxBusUtil
import com.ym.library.rxbus.Subscribe
import com.ym.library.rxbus.ThreadMode
import com.ym.library.utils.ADConfig
import com.ym.library.utils.EventUtils
import com.ym.library.utils.LogUtils
import com.ym.library.utils.Utils
......@@ -60,7 +70,7 @@ object TurntableDialog : TurntableUtils(), TurntableContract.View {
return
}
this.context = context
EventUtils.onEvent("show_lucky_turntable","幸运转盘")
EventUtils.onEvent("show_lucky_turntable", "幸运转盘")
// ToponManager.initNativeAd((context as Activity), AdID.AD_LUCKY_TURNTABLE_BIGIMAGE)
// ToponManager.initRewardAd((context as Activity), AdID.AD_LUCKY_TURNTABLE_VIDEO)
mPresenter = TurntablePresenter(this)
......@@ -87,7 +97,7 @@ object TurntableDialog : TurntableUtils(), TurntableContract.View {
if (turntables?.showVideo == 0 && turntables?.countDownSecond!! < 0) {
//开启转盘
EventUtils.onEvent("click_lucky_turntable_lottery","幸运转盘抽奖")
EventUtils.onEvent("click_lucky_turntable_lottery", "幸运转盘抽奖")
btnTurntableLottery?.isEnabled = false
isStartAnim = true
mPresenter?.getTurntableLotteryResult()
......@@ -177,6 +187,84 @@ object TurntableDialog : TurntableUtils(), TurntableContract.View {
// }
//
// }, AdID.mPlacementId_Reward_video_luck_farm)
AdManager.loadRewardVideoAd(
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()
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 onAdClose() {
getVideoAcceleratorsReceive3();
reset()
btnTurntableLottery?.isEnabled = false
isStartAnim = true
isUpdate = true
mPresenter?.getTurntableLotteryResult()
}
override fun onVideoComplete() {
}
override fun onSkippedVideo() {
}
override fun onFullScreenVideoCached() {
}
override fun onLoadVideoAd(rewardVideoAD: ZXADRewardVideo) {
}
})
}
/**
......@@ -336,4 +424,18 @@ object TurntableDialog : TurntableUtils(), TurntableContract.View {
this.onTouchEvent(event)
}
}
//看视频领上报
fun getVideoAcceleratorsReceive3() {
GameApiClient.gameApi.adVideoReport()
.compose(RxSchedulers.observableIO2Main())
.subscribe(object : BaseObserver<StatusEntity>() {
override fun onSuccess(result: StatusEntity?) {
Log.d("wxw", "看视频上报 Success")
}
override fun onFailure(e: Throwable?, code: String?, errorMsg: String?) {
Log.d("wxw", "看视频上报 error")
}
})
}
}
\ No newline at end of file
......@@ -24,12 +24,12 @@
<TextView
android:id="@+id/id_tv_orderlist_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_40"
android:text=""
android:textColor="#8F4C07"
android:textSize="@dimen/sp_18"
android:text=""
android:textStyle="bold"
android:layout_marginTop="@dimen/dp_40"
android:layout_height="wrap_content" />
android:textStyle="bold" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/id_rel_game_order_list"
......@@ -46,9 +46,9 @@
android:layout_height="wrap_content"
android:layout_below="@+id/id_order_list_content_rel"
android:layout_centerHorizontal="true"
android:layout_marginTop="@dimen/dp_10"
android:background="@drawable/btn_selector"
android:gravity="center"
android:layout_marginTop="@dimen/dp_10"
android:text="继续种植完成订单"
android:textColor="@color/white"
android:textSize="@dimen/sp_18"
......@@ -77,5 +77,7 @@
android:layout_height="wrap_content"
android:layout_alignTop="@id/id_img_order_list_title"
android:layout_alignRight="@id/id_img_order_list_title"
android:layout_marginTop="@dimen/dp_10"
android:layout_marginRight="@dimen/dp_20"
android:src="@mipmap/home_close" />
</RelativeLayout>
\ No newline at end of file
......@@ -136,7 +136,7 @@
android:src="@mipmap/icon_top_bg" />
<TextView
android:id="@+id/id_tv_get"
android:id="@+id/id_tv_gongxi_get"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
......@@ -158,19 +158,11 @@
<FrameLayout
android:id="@+id/layout_get_drop_ad"
android:layout_width="match_parent"
android:layout_height="265dp"
android:layout_height="wrap_content"
android:layout_marginLeft="18dp"
android:layout_marginTop="10dp"
android:layout_marginRight="18dp"
android:visibility="gone" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="14dp"
android:src="@drawable/icon_main_dialog_see_details"
android:visibility="gone" />
android:visibility="gone"
android:layout_marginRight="18dp" />
</LinearLayout>
......
......@@ -8,6 +8,7 @@
<ImageView
android:id="@+id/id_item_game_order_img"
android:layout_width="wrap_content"
android:layout_marginRight="20dp"
android:layout_height="wrap_content" />
<LinearLayout
......@@ -40,7 +41,8 @@
<TextView
android:id="@+id/id_item_game_order_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="5/10"
android:layout_height="match_parent"
android:text="0/0"
android:gravity="bottom"
android:textColor="#FF9128" />
</LinearLayout>
\ No newline at end of file
......@@ -89,10 +89,6 @@ dependencies {
// implementation 'com.google.code.gson:gson:2.8.5'
// implementation files('libs/poi-3.0-rc4-20070503.jar')
//小满
// api "com.bx:adsdk:1.3.2"
// api project(path: ':toponad')
api 'com.tencent.bugly:crashreport:latest.release'
api 'com.tencent.bugly:nativecrashreport:latest.release'
}
......
This diff is collapsed.
This diff is collapsed.
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 com.ym.library.module.NewsEntity;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
/**
* Craeted by ${junqi.li}
* Craeted by 2020/10/16
*/
public class AdCache {
public static HashMap<String,List<NewsEntity>> rewardList = new HashMap<>();
public static HashMap<String,List<NewsEntity>> nativeList = new HashMap<>();
}
package com.ym.library.config;
import android.text.TextUtils;
public class AdError {
public static final int NETWORK_ERROR_CODE = 1000;
public static final int NO_FILL_ERROR_CODE = 1001;
public static final int LOAD_TOO_FREQUENTLY_ERROR_CODE = 1002;
public static final int IMPRESSION_LIMIT_ERROR_CODE = 1003;
public static final int SERVER_ERROR_CODE = 2000;
public static final int INTERNAL_ERROR_CODE = 2001;
public static final int TIME_OUT_CODE = 3000;
public static final int UNKNOW_ERROR_CODE = 3001;
public static final int NO_CHANNEL_ERROR_CODE = 3002;
public static final AdError NETWORK_ERROR = new AdError(NETWORK_ERROR_CODE, "Network Error");
public static final AdError NO_FILL = new AdError(NO_FILL_ERROR_CODE, "No Fill");
public static final AdError LOAD_TOO_FREQUENTLY = new AdError(LOAD_TOO_FREQUENTLY_ERROR_CODE, "Ad was re-loaded too frequently");
public static final AdError SERVER_ERROR = new AdError(SERVER_ERROR_CODE, "Server Error");
public static final AdError INTERNAL_ERROR = new AdError(INTERNAL_ERROR_CODE, "Internal Error");
public static final AdError TIME_OUT_ERROR = new AdError(TIME_OUT_CODE, "Time Out");
public static final AdError UNKNOW_ERROR = new AdError(UNKNOW_ERROR_CODE, "unknow error");
public static final AdError NO_CHANNEL_ERROR = new AdError(NO_CHANNEL_ERROR_CODE, "no channel error");
public static final AdError IMPRESSION_LIMIT_ERROR = new AdError(IMPRESSION_LIMIT_ERROR_CODE, "Impression Limit Error");
private final int errorCode;
private final String errorMessage;
public AdError(int paramInt, String paramString) {
if (TextUtils.isEmpty(paramString))
paramString = "unknown error";
this.errorCode = paramInt;
this.errorMessage = paramString;
}
public int getErrorCode() {
return this.errorCode;
}
public String getErrorMessage() {
return this.errorMessage;
}
public static AdError createAdError(int code, String msg) {
return new AdError(code, msg);
}
}
This diff is collapsed.
package com.ym.library.config;
import android.content.Context;
import android.os.Handler;
import android.os.HandlerThread;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public abstract class BaseChannel implements INativeAdAction {
public volatile boolean isError = false;
public volatile boolean isRefreshing = false;
public volatile boolean isRequested;
public volatile boolean isTimeOut = false;
public long mWaitTime;
public long mStartTime;
public Context mContext;
public int mCacheSize = 1;
public Handler mPullHandler;
public HandlerThread mThread;
public static int MSG_DO_REFRESH = 111;
public int mSid;
public InnerCallBack.AdLoadCallback mLoadCallBack;
public int retryCount = 0;
public List<NativeADWrapper> mCacheList = Collections.synchronizedList(new ArrayList<NativeADWrapper>());
public BaseChannel(Context context, int sid, int cacheSize, long wt) {
this.mContext = context;
this.mSid = sid;
this.mCacheSize = cacheSize;
this.mWaitTime = wt;
}
/**
* 每个广告的时效性不同,故放到子类中处理
*
* @return
*/
public NativeADWrapper doGetAD() {
// 在子类中做处理
if (mCacheList.size() > 0) {
return mCacheList.get(0);
} else {
return null;
}
}
public void setLoadListener(InnerCallBack.AdLoadCallback callback) {
mLoadCallBack = callback;
}
/**
* 在广告拉取onSuccess/onFailed时,调用判断是否需要继续填充(若允许一次拉多个则该方法会判断不触发)
* 加入重试逻辑,拉取失败最多允许重试两次
*/
public void ifContinue() {
if (retryCount > 2) {
return;
}
if (mCacheSize > mCacheList.size()) {
retryCount++;
doLoadAd();
}
}
}
package com.ym.library.config;
import android.content.Context;
/**
* 广告行为约束
*/
public interface INativeAdAction {
// 渠道SDK的初始化动作(非强制),如ad的创建
void doInit(Context context);
// 广告拉取行为
void doLoadAd();
// 返回缓存数量
int getCacheSize();
// 清空缓存
void doClear();
// 广告销毁动作
void doDestroy();
}
package com.ym.library.config;
public interface InnerCallBack {
interface AdLoadCallback {
void onAdLoaded(BaseChannel whichChannel);
void onAdError(BaseChannel whichChannel, AdError error);
}
}
package com.ym.library.config;
import android.graphics.Bitmap;
import java.util.List;
/**
* NativeADWrapper 只用来约束内部广告返回行为
* 真正的点击和展示监控回调,放到外部{@seeNativeAd}接口
*/
public interface NativeADWrapper {
// 获取广告ID
String getAdId();
// 大图URL
List<String> getAdImageUrl();
// icon URL
String getAdIconUrl();
// 广告简介/内容
String getAdContent();
// 意向文案(立即下载/点击查看/了解更多)
String getAdCallToAction();
// String getAdBody();
// 广告标题
String getAdTitle();
// 应用评分
float getAdStarRating();
// 广告来源,可选
String getAdSource();
// 判定广告是否有效
boolean isValid();
// 素材类型 - 针对元素有效
int getAdMaterialType();
// 广告类型
int getAdActionType();
// 广告logo
Bitmap getSDKLogo();
// 广告销毁
void destroy();
// 返回渠道类型
int getAdChannelType();
// 返回渠道名
String getAdChannelName();
// 返回原数据对象
Object getOrgAdData();
}
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 = ""
//是否使用 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 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
import android.app.Activity
import com.bytedance.sdk.openadsdk.TTRewardVideoAd
import com.qq.e.ads.rewardvideo.RewardVideoAD
import java.util.*
class ZXADRewardVideo(var rewardVideoAD: Any?) {
}
\ No newline at end of file
package com.ym.library.config
data class ZXADSizeConfig(var width:Int
, var height:Int)
\ No newline at end of file
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_SG = 4 //搜狗
const val PLANTFORM_AD_KDXF = 5 //科大讯飞
const val PLANTFORM_AD_SIGNMOB = "signMob" //sign Mob
const val PLANTFORM_AD_BD = "baidu" //百度
const val PLANTFORM_SH_AD = "shanhu"//珊瑚
// =====================================================================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.
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.library.listener;
/**
* Created by gaoleichao on 2018/12/3.
*/
public interface AdCallback<T> {
void onResult(int code, T result);
}
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.
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.
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