Commit 5d609ef7 authored by mengcuiguang's avatar mengcuiguang

个人中心添加信息流

parent 55fbb175
......@@ -12,8 +12,8 @@ android {
applicationId "com.mints.helivideo"
minSdkVersion rootProject.ext.androidMinSdkVersion
targetSdkVersion rootProject.ext.androidTargetSdkVersion
versionCode 9
versionName "1.0.8"
versionCode 10
versionName "1.0.9"
flavorDimensions "default"
// dex突破65535的限制
......@@ -66,6 +66,7 @@ android {
buildConfigField "String", "GROMORE_VIDEO_CODE", GROMORE_VIDEO_CODE
buildConfigField "String", "GROMORE_DRAW_CODE", GROMORE_DRAW_CODE
buildConfigField "String", "GROMORE_EXPRESS_CODE", GROMORE_EXPRESS_CODE
buildConfigField "String", "GROMORE_MYEXPRESS_CODE", GROMORE_MYEXPRESS_CODE
buildConfigField "String", "GROMORE_BANNER_CODE", GROMORE_BANNER_CODE
buildConfigField "String", "RELEASE_TALKING_DATA_KEY", RELEASE_TALKING_DATA_KEY
buildConfigField "String", "WEIXIN_APP_PAY_ID", WEIXIN_APP_PAY_ID
......@@ -89,6 +90,7 @@ android {
buildConfigField "String", "GROMORE_VIDEO_CODE", GROMORE_VIDEO_CODE
buildConfigField "String", "GROMORE_DRAW_CODE", GROMORE_DRAW_CODE
buildConfigField "String", "GROMORE_EXPRESS_CODE", GROMORE_EXPRESS_CODE
buildConfigField "String", "GROMORE_MYEXPRESS_CODE", GROMORE_MYEXPRESS_CODE
buildConfigField "String", "GROMORE_BANNER_CODE", GROMORE_BANNER_CODE
buildConfigField "String", "RELEASE_TALKING_DATA_KEY", RELEASE_TALKING_DATA_KEY
buildConfigField "String", "WEIXIN_APP_PAY_ID", WEIXIN_APP_PAY_ID
......
package com.mints.helivideo.ad.express
import android.net.Uri
import android.text.TextUtils
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.*
import com.bumptech.glide.Glide
import com.bytedance.sdk.openadsdk.*
import com.bytedance.sdk.openadsdk.mediation.ad.MediationExpressRenderListener
import com.bytedance.sdk.openadsdk.mediation.ad.MediationViewBinder
import com.mints.helivideo.MintsApplication
import com.mints.helivideo.ad.AdManager
import com.mints.helivideo.utils.ForegroundOrBackground
import com.mints.helivideo.utils.LogUtil
import com.mints.helivideo.utils.TimeRender
import com.mints.helivideo.utils.UIUtils
import java.lang.Exception
import java.util.ArrayList
/**
* 信息流
*/
class MyExpressManager {
companion object {
val instance: MyExpressManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
MyExpressManager()
}
}
private var frameLayout: FrameLayout? = null
private val adLoadTime: Long = 0 // 广告展示时间,45分钟后当前广告失效,重新预加载广告
private var adPreingTime: Long = 0 // 防止预加载超时 2分钟
private var isLoadSuccess = 0 //0-加载失败/未加载 1-加载中 2-加载成功
private var mExpressAdCallback: ExpressAdCallback? = null
private var mTTFeedAd: TTFeedAd? = null
fun preLoadAd() {
val isOversped = TimeRender.isOverspedMin(adLoadTime, AdManager.AD_NO_SHOWTIME_OUT)
val isPreingOversped = TimeRender.isOverspedMin(adPreingTime, AdManager.AD_REQUEST_TIME_OUT)
LogUtil.d(
TAG,
"gromore信息流--> 1、进入预加载 isLoadSuccess=$isLoadSuccess isOversped=$isOversped isPreingOversped=$isPreingOversped"
)
if ((isLoadSuccess == 0 // 加载失败
|| adLoadTime > 0 && isOversped // 超过45分钟
|| adPreingTime > 0 && isPreingOversped && isLoadSuccess == 1) // 预加载超时
) {
LogUtil.d(TAG, "gromore信息流--> 2、执行预加载去了=$isLoadSuccess")
adPreingTime = System.currentTimeMillis()
isLoadSuccess = 1
// 销毁及移除事件
// destroy()
this.frameLayout = FrameLayout(MintsApplication.getContext())
loadAd()
}
}
private fun loadAd() {
val activity = ForegroundOrBackground.getTopActivity()
val adNativeLoader = TTAdSdk.getAdManager().createAdNative(activity)
val adslot = AdSlot.Builder()
.setCodeId(BuildConfig.GROMORE_MYEXPRESS_CODE)
/**
* 注:
* 1:单位为px
* 2:如果是信息流自渲染广告,设置广告图片期望的图片宽高 ,不能为0
* 2:如果是信息流模板广告,宽度设置为希望的宽度,高度设置为0(0为高度选择自适应参数)
*/
.setImageAcceptedSize(UIUtils.getAdWidth(MintsApplication.getContext()).toInt(), 0)
.setAdCount(3)//请求广告数量为1到3条 (优先采用平台配置的数量)
.build()
adNativeLoader.loadFeedAd(adslot, object : TTAdNative.FeedAdListener {
override fun onError(p0: Int, p1: String?) {
LogUtil.e(TAG, "gromore信息流--> 3、load feed ad error : $p0, $p1")
isLoadSuccess = 0
}
override fun onFeedAdLoad(ads: MutableList<TTFeedAd>?) {
ads?.let {
if (it.isEmpty()) {
isLoadSuccess = 0
return
}
if (it.size > 0) {
mTTFeedAd = it[0]
isLoadSuccess = 2
showAd()
}
}
}
})
}
private fun showAd() {
mTTFeedAd?.let {
if (it.mediationManager.isExpress) {
//--------------信息流模板广告渲染----------------
showExpressView(it)
} else {
//--------------信息流自渲染广告渲染----------------
val view: View? = when (it.imageMode) {
TTAdConstant.IMAGE_MODE_SMALL_IMG -> getSmallAdView(frameLayout)//信息流自渲染广告渲染 :小图广告
TTAdConstant.IMAGE_MODE_LARGE_IMG -> getLargeAdView(frameLayout)//信息流自渲染广告渲染 :大图广告
TTAdConstant.IMAGE_MODE_GROUP_IMG -> getGroupAdView(frameLayout)//信息流自渲染广告渲染 :组图广告
TTAdConstant.IMAGE_MODE_VIDEO -> getVideoView(frameLayout)//信息流自渲染广告渲染 :视频广告
TTAdConstant.IMAGE_MODE_VERTICAL_IMG -> getVerticalAdView(frameLayout)//信息流自渲染广告渲染 :竖图广告
TTAdConstant.IMAGE_MODE_VIDEO_VERTICAL -> getVideoView(frameLayout)//信息流自渲染广告渲染 :竖版视频广告
else -> {
Log.i(TAG, "展示样式错误")
null
}
}
view?.let {
it.layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
)
frameLayout?.removeAllViews()
frameLayout?.addView(it)
}
}
}
}
fun getAdView(callback: ExpressAdCallback?) {
val isOversped = TimeRender.isOverspedMin(adLoadTime, AdManager.AD_NO_SHOWTIME_OUT)
// 若上一个广告还在加载中则返回
if (isLoadSuccess == 1) {
this.mExpressAdCallback = callback
LogUtil.d(TAG, "gromore信息流--> 3.9、广告加载中 LoadSuccess = $isLoadSuccess")
return
}
this.mExpressAdCallback = null
if (isLoadSuccess == 2 && !isOversped) {
LogUtil.d(
TAG,
"gromore信息流--> 4、展示广告 LoadSuccess=$isLoadSuccess isOversped=$isOversped"
)
isLoadSuccess = 0
callback?.loadSuccess(frameLayout)
} else {
LogUtil.e(TAG, "gromore信息流--> 5、展示广告时失败了,广告可能超时45分钟 onError ")
// 状态重置
isLoadSuccess = 0
callback?.loadFail()
}
}
private fun showExpressView(it: TTFeedAd) {
it.setExpressRenderListener(object : MediationExpressRenderListener {
override fun onRenderSuccess(p0: View?, p1: Float, p2: Float, p3: Boolean) {
Log.i(TAG, "onRenderSuccess")
it.setDislikeCallback(
ForegroundOrBackground.getTopActivity(),
object : TTAdDislike.DislikeInteractionCallback {
override fun onShow() {
Log.i(TAG, "express dislike 点击show")
}
override fun onSelected(position: Int, value: String?, enforce: Boolean) {
Log.i(TAG, "express 点击 $value")
}
override fun onCancel() {
Log.i(TAG, "express dislike 点击了取消")
}
})
it.adView?.let { view ->
if (view.parent != null) {
(view.parent as ViewGroup).removeView(view)
}
frameLayout?.addView(view)
}
mExpressAdCallback?.let {
if (it.renderSuccess(frameLayout)) {
isLoadSuccess = 0
}
}
mExpressAdCallback = null
}
override fun onRenderFail(p0: View?, p1: String?, p2: Int) {
isLoadSuccess = 0
LogUtil.e(TAG, "gromore信息流--> 5、展示广告时失败了,onRenderFail msg=${p1} code=${p2} ")
}
override fun onAdClick() {
Log.i(TAG, "onAdClick")
}
override fun onAdShow() {
Log.i(TAG, "onAdShow")
Log.i(TAG, "ad mediaExtraInfo ${it.mediaExtraInfo}")
}
})
it.render()//必须要调用render方法进行渲染,在onRenderSuccess中处理模板的view
}
/**
* 销毁
*/
fun destroy() {
// frameLayout?.removeAllViews()
// frameLayout = null
mTTFeedAd?.destroy()
this.mExpressAdCallback = null
}
fun getFrameLayout(): View? {
return frameLayout
}
private fun getSmallAdView(parent: ViewGroup?): View? {
val convertView =
LayoutInflater.from(ForegroundOrBackground.getTopActivity())
.inflate(
R.layout.mediation_listitem_ad_small_pic,
parent,
false
)
val adViewHolder = SmallAdViewHolder()
adViewHolder.mTitle =
convertView.findViewById<View>(R.id.tv_listitem_ad_title) as TextView
adViewHolder.mSource =
convertView.findViewById<View>(R.id.tv_listitem_ad_source) as TextView
adViewHolder.mDescription =
convertView.findViewById<View>(R.id.tv_listitem_ad_desc) as TextView
adViewHolder.mSmallImage =
convertView.findViewById<View>(R.id.iv_listitem_image) as ImageView
adViewHolder.mIcon =
convertView.findViewById<View>(R.id.iv_listitem_icon) as ImageView
adViewHolder.mDislike =
convertView.findViewById<View>(R.id.iv_listitem_dislike) as ImageView
adViewHolder.mCreativeButton =
convertView.findViewById<View>(R.id.btn_listitem_creative) as Button
adViewHolder.app_info =
convertView.findViewById<LinearLayout>(R.id.app_info)
adViewHolder.app_name =
convertView.findViewById<TextView>(R.id.app_name)
adViewHolder.author_name =
convertView.findViewById<TextView>(R.id.author_name)
adViewHolder.package_size =
convertView.findViewById<TextView>(R.id.package_size)
adViewHolder.permissions_url =
convertView.findViewById<TextView>(R.id.permissions_url)
adViewHolder.permissions_content =
convertView.findViewById<TextView>(R.id.permissions_content)
adViewHolder.privacy_agreement =
convertView.findViewById<TextView>(R.id.privacy_agreement)
adViewHolder.version_name =
convertView.findViewById<TextView>(R.id.version_name)
val viewBinder =
MediationViewBinder.Builder(R.layout.mediation_listitem_ad_small_pic)
.titleId(R.id.tv_listitem_ad_title)
.sourceId(R.id.tv_listitem_ad_source).descriptionTextId(
R.id.tv_listitem_ad_desc
)
.mainImageId(R.id.iv_listitem_image)
.logoLayoutId(R.id.tt_ad_logo)
.callToActionId(R.id.btn_listitem_creative)
.iconImageId(R.id.iv_listitem_icon).build()
adViewHolder.viewBinder = viewBinder
bindData(convertView, adViewHolder)
if (mTTFeedAd?.imageList?.size != 0) {
mTTFeedAd?.let { ttfeedad ->
ttfeedad.imageList[0]?.imageUrl?.let {
Glide.with(ForegroundOrBackground.getTopActivity()).load(it)
.into(adViewHolder.mSmallImage!!)
}
}
}
return convertView;
}
private fun getLargeAdView(parent: ViewGroup?): View {
val adViewHolder = LargeAdViewHolder()
var convertView: View =
LayoutInflater.from(ForegroundOrBackground.getTopActivity())
.inflate(
R.layout.mediation_listitem_ad_large_pic,
parent,
false
)
adViewHolder.mTitle =
convertView.findViewById<View>(R.id.tv_listitem_ad_title) as TextView
adViewHolder.mDescription =
convertView.findViewById<View>(R.id.tv_listitem_ad_desc) as TextView
adViewHolder.mSource =
convertView.findViewById<View>(R.id.tv_listitem_ad_source) as TextView
adViewHolder.mLargeImage =
convertView.findViewById<View>(R.id.iv_listitem_image) as ImageView
adViewHolder.mIcon =
convertView.findViewById<View>(R.id.iv_listitem_icon) as ImageView
adViewHolder.mDislike =
convertView.findViewById<View>(R.id.iv_listitem_dislike) as ImageView
adViewHolder.mCreativeButton =
convertView.findViewById<View>(R.id.btn_listitem_creative) as Button
adViewHolder.mLogo =
convertView.findViewById<RelativeLayout>(R.id.tt_ad_logo) //logoView 建议传入GroupView类型
adViewHolder.app_info =
convertView.findViewById<LinearLayout>(R.id.app_info)
adViewHolder.app_name =
convertView.findViewById<TextView>(R.id.app_name)
adViewHolder.author_name =
convertView.findViewById<TextView>(R.id.author_name)
adViewHolder.package_size =
convertView.findViewById<TextView>(R.id.package_size)
adViewHolder.permissions_url =
convertView.findViewById<TextView>(R.id.permissions_url)
adViewHolder.permissions_content =
convertView.findViewById<TextView>(R.id.permissions_content)
adViewHolder.privacy_agreement =
convertView.findViewById<TextView>(R.id.privacy_agreement)
adViewHolder.version_name =
convertView.findViewById<TextView>(R.id.version_name)
val viewBinder =
MediationViewBinder.Builder(R.layout.mediation_listitem_ad_large_pic)
.titleId(R.id.tv_listitem_ad_title)
.descriptionTextId(R.id.tv_listitem_ad_desc).sourceId(
R.id.tv_listitem_ad_source
)
.mainImageId(R.id.iv_listitem_image)
.callToActionId(R.id.btn_listitem_creative)
.logoLayoutId(R.id.tt_ad_logo)
.iconImageId(R.id.iv_listitem_icon).build()
adViewHolder.viewBinder = viewBinder
bindData(convertView, adViewHolder)
if (mTTFeedAd?.imageList?.size != 0) {
mTTFeedAd?.let { ttfeedad ->
ttfeedad.imageList[0]?.imageUrl?.let {
Glide.with(ForegroundOrBackground.getTopActivity()).load(it)
.into(adViewHolder.mLargeImage!!)
}
}
}
return convertView
}
private fun getGroupAdView(parent: ViewGroup?): View? {
val adViewHolder = GroupAdViewHolder()
var convertView: View = LayoutInflater.from(ForegroundOrBackground.getTopActivity())
.inflate(
R.layout.mediation_listitem_ad_group_pic,
parent,
false
)
adViewHolder.mTitle =
convertView.findViewById<View>(R.id.tv_listitem_ad_title) as TextView
adViewHolder.mSource =
convertView.findViewById<View>(R.id.tv_listitem_ad_source) as TextView
adViewHolder.mDescription =
convertView.findViewById<View>(R.id.tv_listitem_ad_desc) as TextView
adViewHolder.mGroupImage1 =
convertView.findViewById<View>(R.id.iv_listitem_image1) as ImageView
adViewHolder.mGroupImage2 =
convertView.findViewById<View>(R.id.iv_listitem_image2) as ImageView
adViewHolder.mGroupImage3 =
convertView.findViewById<View>(R.id.iv_listitem_image3) as ImageView
adViewHolder.mIcon =
convertView.findViewById<View>(R.id.iv_listitem_icon) as ImageView
adViewHolder.mDislike =
convertView.findViewById<View>(R.id.iv_listitem_dislike) as ImageView
adViewHolder.mCreativeButton =
convertView.findViewById<View>(R.id.btn_listitem_creative) as Button
adViewHolder.mLogo =
convertView.findViewById<RelativeLayout>(R.id.tt_ad_logo) //logoView 建议传入GroupView类型
adViewHolder.app_info =
convertView.findViewById<LinearLayout>(R.id.app_info)
adViewHolder.app_name =
convertView.findViewById<TextView>(R.id.app_name)
adViewHolder.author_name =
convertView.findViewById<TextView>(R.id.author_name)
adViewHolder.package_size =
convertView.findViewById<TextView>(R.id.package_size)
adViewHolder.permissions_url =
convertView.findViewById<TextView>(R.id.permissions_url)
adViewHolder.permissions_content =
convertView.findViewById<TextView>(R.id.permissions_content)
adViewHolder.privacy_agreement =
convertView.findViewById<TextView>(R.id.privacy_agreement)
adViewHolder.version_name =
convertView.findViewById<TextView>(R.id.version_name)
val viewBinder =
MediationViewBinder.Builder(R.layout.mediation_listitem_ad_group_pic)
.titleId(R.id.tv_listitem_ad_title)
.descriptionTextId(R.id.tv_listitem_ad_desc).sourceId(
R.id.tv_listitem_ad_source
)
.mainImageId(R.id.iv_listitem_image1)
.logoLayoutId(R.id.tt_ad_logo).callToActionId(
R.id.btn_listitem_creative
).iconImageId(R.id.iv_listitem_icon)
.groupImage1Id(R.id.iv_listitem_image1).groupImage2Id(
R.id.iv_listitem_image2
)
.groupImage3Id(R.id.iv_listitem_image3).build()
adViewHolder.viewBinder = viewBinder
bindData(convertView, adViewHolder)
if (mTTFeedAd?.imageList?.size ?: 0 >= 3) {
val image1: String? = mTTFeedAd?.imageList?.get(0)?.imageUrl
val image2: String? = mTTFeedAd?.imageList?.get(1)?.imageUrl
val image3: String? = mTTFeedAd?.imageList?.get(2)?.imageUrl
if (image1 != null) {
Glide.with(ForegroundOrBackground.getTopActivity()).load(image1)
.into(adViewHolder.mGroupImage1!!)
}
if (image2 != null) {
Glide.with(ForegroundOrBackground.getTopActivity()).load(image2)
.into(adViewHolder.mGroupImage2!!)
}
if (image3 != null) {
Glide.with(ForegroundOrBackground.getTopActivity()).load(image3)
.into(adViewHolder.mGroupImage3!!)
}
}
return convertView
}
private fun getVideoView(parent: ViewGroup?): View? {
val adViewHolder = VideoAdViewHolder()
var convertView: View? = null
try {
convertView = LayoutInflater.from(ForegroundOrBackground.getTopActivity())
.inflate(
R.layout.mediation_listitem_ad_large_video,
parent,
false
)
adViewHolder.mTitle =
convertView.findViewById<View>(R.id.tv_listitem_ad_title) as TextView
adViewHolder.mDescription =
convertView.findViewById<View>(R.id.tv_listitem_ad_desc) as TextView
adViewHolder.mSource =
convertView.findViewById<View>(R.id.tv_listitem_ad_source) as TextView
adViewHolder.videoView =
convertView.findViewById<View>(R.id.iv_listitem_video) as FrameLayout
adViewHolder.mIcon =
convertView.findViewById<View>(R.id.iv_listitem_icon) as ImageView
adViewHolder.mDislike =
convertView.findViewById<View>(R.id.iv_listitem_dislike) as ImageView
adViewHolder.mCreativeButton =
convertView.findViewById<View>(R.id.btn_listitem_creative) as Button
adViewHolder.mLogo =
convertView.findViewById<RelativeLayout>(R.id.tt_ad_logo) //logoView 建议传入GroupView类型
adViewHolder.app_info =
convertView.findViewById<LinearLayout>(R.id.app_info)
adViewHolder.app_name =
convertView.findViewById<TextView>(R.id.app_name)
adViewHolder.author_name =
convertView.findViewById<TextView>(R.id.author_name)
adViewHolder.package_size =
convertView.findViewById<TextView>(R.id.package_size)
adViewHolder.permissions_url =
convertView.findViewById<TextView>(R.id.permissions_url)
adViewHolder.permissions_content =
convertView.findViewById<TextView>(R.id.permissions_content)
adViewHolder.privacy_agreement =
convertView.findViewById<TextView>(R.id.privacy_agreement)
adViewHolder.version_name =
convertView.findViewById<TextView>(R.id.version_name)
val viewBinder =
MediationViewBinder.Builder(R.layout.mediation_listitem_ad_large_video)
.titleId(R.id.tv_listitem_ad_title)
.sourceId(R.id.tv_listitem_ad_source)
.descriptionTextId(R.id.tv_listitem_ad_desc)
.mediaViewIdId(
R.id.iv_listitem_video
)
.callToActionId(R.id.btn_listitem_creative)
.logoLayoutId(R.id.tt_ad_logo)
.iconImageId(R.id.iv_listitem_icon).build()
adViewHolder.viewBinder = viewBinder
// 如果自己有需求进行视频播放操作,则按如下步骤进行。注意:不是所有adn都支持,因此需要进行判空操作。
// mTTFeedAd?.csjmAdInfo?.setUseCustomVideo(true) // 注意:要在registerView之前调用
val videoUrl: String? = mTTFeedAd?.customVideo?.videoUrl // 注意:不是所有adn都支持,这里务必要进行判空操作
if (!TextUtils.isEmpty(videoUrl)) {
// 如果通过getVideoUrl返回的url不是空,则自己处理视频播放操作,并通过reporter上报视频状态
playAdVideo(adViewHolder.videoView as FrameLayout, videoUrl ?: "")
} else {
// 注意:即使该adn支持返回url,但某次偶然原因返回的videoUrl为空,则仍然会用adn自己的视频播放作为兜底
}
//视频广告设置播放状态回调(可选)
mTTFeedAd?.setVideoAdListener(object : TTFeedAd.VideoAdListener {
override fun onVideoLoad(ad: TTFeedAd?) {
Log.i(TAG, "onVideoLoad")
}
override fun onVideoError(errorCode: Int, extraCode: Int) {
Log.i(TAG, "onVideoError")
}
override fun onVideoAdStartPlay(ad: TTFeedAd?) {
Log.i(TAG, "onVideoAdStartPlay")
}
override fun onVideoAdPaused(ad: TTFeedAd?) {
Log.i(TAG, "onVideoAdPaused")
}
override fun onVideoAdContinuePlay(ad: TTFeedAd?) {
Log.i(TAG, "onVideoAdContinuePlay")
}
override fun onProgressUpdate(current: Long, duration: Long) {
Log.i(TAG, "onProgressUpdate")
}
override fun onVideoAdComplete(ad: TTFeedAd?) {
Log.i(TAG, "onVideoAdComplete")
}
})
mTTFeedAd?.setDownloadListener(object : TTAppDownloadListener {
override fun onIdle() {
Log.i(TAG, "setDownloadListener")
}
override fun onDownloadActive(
totalBytes: Long,
currBytes: Long,
fileName: String?,
appName: String?
) {
Log.i(TAG, "onDownloadActive")
}
override fun onDownloadPaused(
totalBytes: Long,
currBytes: Long,
fileName: String?,
appName: String?
) {
Log.i(TAG, "onDownloadPaused")
}
override fun onDownloadFailed(
totalBytes: Long,
currBytes: Long,
fileName: String?,
appName: String?
) {
Log.i(TAG, "onDownloadFailed")
}
override fun onDownloadFinished(
totalBytes: Long,
fileName: String?,
appName: String?
) {
Log.i(TAG, "onDownloadFinished")
}
override fun onInstalled(fileName: String?, appName: String?) {
Log.i(TAG, "onInstalled")
}
})
//绑定广告数据、设置交互回调
bindData(convertView, adViewHolder)
} catch (e: Exception) {
e.printStackTrace()
}
return convertView
}
private var mVideoView: VideoView? = null
private var customVideoReporter: TTFeedAd.CustomizeVideo? = null
private fun playAdVideo(videoContainer: ViewGroup, videoUrl: String) {
mVideoView = VideoView(MintsApplication.getContext())
videoContainer.addView(mVideoView)
customVideoReporter = mTTFeedAd?.customVideo
// 开发者根据自己的需求,做相应的视频控制界面,播放暂停等
mVideoView?.setVideoURI(Uri.parse(videoUrl))
mVideoView?.setOnErrorListener { mp, what, extra ->
if (customVideoReporter != null) {
customVideoReporter?.reportVideoError(
mVideoView!!.currentPosition.toLong(),
what,
extra
)
}
false
}
mVideoView?.setOnCompletionListener {
if (customVideoReporter != null) {
customVideoReporter?.reportVideoFinish()
}
}
mVideoView?.start()
customVideoReporter?.reportVideoStart()
}
private fun getVerticalAdView(parent: ViewGroup?): View? {
val adViewHolder = VerticalAdViewHolder()
var convertView = LayoutInflater.from(ForegroundOrBackground.getTopActivity())
.inflate(
R.layout.mediation_listitem_ad_vertical_pic,
parent,
false
)
adViewHolder.mTitle =
convertView.findViewById<View>(R.id.tv_listitem_ad_title) as TextView
adViewHolder.mSource =
convertView.findViewById<View>(R.id.tv_listitem_ad_source) as TextView
adViewHolder.mDescription =
convertView?.findViewById<View>(R.id.tv_listitem_ad_desc) as TextView
adViewHolder.mVerticalImage =
convertView.findViewById<ImageView>(R.id.iv_listitem_image)
adViewHolder.mIcon =
convertView.findViewById<View>(R.id.iv_listitem_icon) as ImageView
adViewHolder.mDislike =
convertView.findViewById<View>(R.id.iv_listitem_dislike) as ImageView
adViewHolder.mCreativeButton =
convertView.findViewById<View>(R.id.btn_listitem_creative) as Button
// adViewHolder.mLogo =
// convertView.findViewById<RelativeLayout>(R.id.tt_ad_logo) //logoView 建议传入GroupView类型
adViewHolder.app_info =
convertView.findViewById<LinearLayout>(R.id.app_info)
adViewHolder.app_name =
convertView.findViewById<TextView>(R.id.app_name)
adViewHolder.author_name =
convertView.findViewById<TextView>(R.id.author_name)
adViewHolder.package_size =
convertView.findViewById<TextView>(R.id.package_size)
adViewHolder.permissions_url =
convertView.findViewById<TextView>(R.id.permissions_url)
adViewHolder.permissions_content =
convertView.findViewById<TextView>(R.id.permissions_content)
adViewHolder.privacy_agreement =
convertView.findViewById<TextView>(R.id.privacy_agreement)
adViewHolder.version_name =
convertView.findViewById<TextView>(R.id.version_name)
val viewBinder =
MediationViewBinder.Builder(R.layout.mediation_listitem_ad_vertical_pic)
.titleId(R.id.tv_listitem_ad_title)
.descriptionTextId(R.id.tv_listitem_ad_desc)
.mainImageId(R.id.iv_listitem_image)
.iconImageId(R.id.iv_listitem_icon)
.callToActionId(R.id.btn_listitem_creative)
.sourceId(R.id.tv_listitem_ad_source)
.logoLayoutId(R.id.tt_ad_logo) //logoView 建议传入GroupView类型
.build()
adViewHolder.viewBinder = viewBinder
bindData(convertView, adViewHolder)
if (mTTFeedAd?.imageList?.size != 0) {
mTTFeedAd?.let { ttfeedad ->
ttfeedad.imageList[0]?.imageUrl?.let {
Glide.with(ForegroundOrBackground.getTopActivity()).load(it)
.into(adViewHolder.mVerticalImage!!)
}
}
}
return convertView
}
private fun bindData(convertView: View, adViewHolder: AdViewHolder) {
mTTFeedAd?.let {
if (it.mediationManager?.hasDislike() == true) {
val ttAdDislike: TTAdDislike =
it.getDislikeDialog(ForegroundOrBackground.getTopActivity())
adViewHolder.mDislike?.visibility = View.VISIBLE
adViewHolder.mDislike?.setOnClickListener(View.OnClickListener {
//使用接口来展示
ttAdDislike.showDislikeDialog()
ttAdDislike.setDislikeInteractionCallback(object :
TTAdDislike.DislikeInteractionCallback {
override fun onShow() {
Log.i(TAG, "dislike 点击show")
}
override fun onSelected(position: Int, value: String?, enforce: Boolean) {
Log.i(TAG, "点击 $value")
//用户选择不喜欢原因后,移除广告展示
frameLayout?.removeAllViews()
}
override fun onCancel() {
Log.i(TAG, "dislike 点击了取消")
}
})
})
} else {
if (adViewHolder.mDislike != null) adViewHolder.mDislike?.visibility = View.GONE
}
setDownLoadAppInfo(it, adViewHolder)
//可以被点击的view, 也可以把convertView放进来意味item可被点击
val clickViewList: MutableList<View?> = ArrayList()
clickViewList.add(convertView)
clickViewList.add(adViewHolder.mSource)
clickViewList.add(adViewHolder.mTitle)
clickViewList.add(adViewHolder.mDescription)
clickViewList.add(adViewHolder.mIcon)
//添加点击区域
if (adViewHolder is LargeAdViewHolder) {
clickViewList.add(adViewHolder.mLargeImage)
} else if (adViewHolder is SmallAdViewHolder) {
clickViewList.add(adViewHolder.mSmallImage)
} else if (adViewHolder is VerticalAdViewHolder) {
clickViewList.add(adViewHolder.mVerticalImage)
} else if (adViewHolder is VideoAdViewHolder) {
clickViewList.add(adViewHolder.videoView)
} else if (adViewHolder is GroupAdViewHolder) {
clickViewList.add(adViewHolder.mGroupImage1)
clickViewList.add(adViewHolder.mGroupImage2)
clickViewList.add(adViewHolder.mGroupImage3)
}
//触发创意广告的view(点击下载或拨打电话)
val creativeViewList: MutableList<View?> = ArrayList()
creativeViewList.add(adViewHolder.mCreativeButton)
//重要! 这个涉及到广告计费,必须正确调用。**** convertView必须是com.bytedance.msdk.api.format.TTNativeAdView ****
it.registerViewForInteraction(
ForegroundOrBackground.getTopActivity(),
convertView as ViewGroup,
clickViewList,
creativeViewList,
null,
object : TTNativeAd.AdInteractionListener {
override fun onAdClicked(view: View?, ad: TTNativeAd?) {
Log.i(TAG, "onAdClicked")
}
override fun onAdCreativeClick(view: View?, ad: TTNativeAd?) {
Log.i(TAG, "onAdCreativeClick")
}
override fun onAdShow(ad: TTNativeAd?) {
Log.i(TAG, "onAdShow")
ad?.let {
// PrintUtil.printShowInfo(ad.mediationManager)
}
}
},
adViewHolder.viewBinder
)
adViewHolder.mTitle?.text = it.title //title为广告的简单信息提示
adViewHolder.mDescription?.text = it.description //description为广告的较长的说明
adViewHolder.mSource?.text =
if (TextUtils.isEmpty(it.source)) "广告来源" else it.source
val icon: TTImage? = it.icon
if (icon != null) {
Glide.with(ForegroundOrBackground.getTopActivity()).load(icon.imageUrl)
.into(adViewHolder.mIcon!!)
}
val adCreativeButton = adViewHolder.mCreativeButton
when (it.interactionType) {
TTAdConstant.INTERACTION_TYPE_DOWNLOAD -> {
adCreativeButton?.visibility = View.VISIBLE;
adCreativeButton?.setText(it.buttonText ?: "立即下载")
}
TTAdConstant.INTERACTION_TYPE_DIAL -> {
adCreativeButton?.visibility = View.VISIBLE;
adCreativeButton?.setText("立即拨打");
}
TTAdConstant.INTERACTION_TYPE_LANDING_PAGE,
TTAdConstant.INTERACTION_TYPE_BROWSER -> {
adCreativeButton?.visibility = View.VISIBLE;
adCreativeButton?.setText(it.buttonText ?: "查看详情")
}
else -> {
adCreativeButton?.visibility = View.GONE
Log.i(TAG, "交互类型异常")
}
}
}
}
private fun setDownLoadAppInfo(ttNativeAd: TTFeedAd, adViewHolder: AdViewHolder) {
if (ttNativeAd.complianceInfo == null) {
adViewHolder.app_info?.visibility = View.GONE
} else {
adViewHolder.app_info?.visibility = View.VISIBLE
val appInfo = ttNativeAd.complianceInfo
adViewHolder.app_name?.text = "应用名称:" + appInfo.appName
adViewHolder.author_name?.text = "开发者:" + appInfo.developerName
adViewHolder.package_size?.text = "包大小:不支持"
adViewHolder.permissions_url?.text = "权限url:不支持"
adViewHolder.privacy_agreement?.text = "隐私url:" + appInfo.privacyUrl
adViewHolder.version_name?.text = "版本号:" + appInfo.appVersion
adViewHolder.permissions_content!!.text =
"权限内容:" + getPermissionsContent(appInfo.permissionsMap)
}
}
private fun getPermissionsContent(permissionsMap: Map<String, String>?): String {
if (permissionsMap == null) {
return ""
}
val stringBuffer = StringBuffer()
val keyList = permissionsMap.keys
for (s in keyList) {
stringBuffer.append(
"""$s : ${permissionsMap[s]} """
)
}
return stringBuffer.toString()
}
private class VideoAdViewHolder : AdViewHolder() {
var videoView: FrameLayout? = null
}
private class LargeAdViewHolder : AdViewHolder() {
var mLargeImage: ImageView? = null
}
private class SmallAdViewHolder : AdViewHolder() {
var mSmallImage: ImageView? = null
}
private class VerticalAdViewHolder : AdViewHolder() {
var mVerticalImage: ImageView? = null
}
private class GroupAdViewHolder : AdViewHolder() {
var mGroupImage1: ImageView? = null
var mGroupImage2: ImageView? = null
var mGroupImage3: ImageView? = null
}
private class ExpressAdViewHolder {
var mAdContainerView: FrameLayout? = null
}
open private class AdViewHolder {
var viewBinder: MediationViewBinder? = null
var mIcon: ImageView? = null
var mDislike: ImageView? = null
var mCreativeButton: Button? = null
var mTitle: TextView? = null
var mDescription: TextView? = null
var mSource: TextView? = null
var mLogo: RelativeLayout? = null
var app_info: LinearLayout? = null
var app_name: TextView? = null
var author_name: TextView? = null
var package_size: TextView? = null
var permissions_url: TextView? = null
var privacy_agreement: TextView? = null
var version_name: TextView? = null
var permissions_content: TextView? = null
}
}
\ No newline at end of file
......@@ -138,7 +138,7 @@ class MobileLoginActivity : BaseActivity(), LoginView, View.OnClickListener {
if (isFinishing) return
// false-登录 true-绑定手机号
showToast("登录成功")
showToast("绑定成功")
hideLoading()
......@@ -158,13 +158,8 @@ class MobileLoginActivity : BaseActivity(), LoginView, View.OnClickListener {
}
private fun initView() {
if (TextUtils.equals(enterType, "vip")) {
tv_title.text = "绑定手机号"
tvLoginNext.text = "立即绑定"
} else {
tv_title.text = "手机号登录"
tvLoginNext.text = "立即登录"
}
tvLoginNext.text = "绑定手机号"
iv_left_icon.visibility = View.VISIBLE
iv_left_icon.setImageResource(R.mipmap.ic_arrow_back)
......
......@@ -6,12 +6,16 @@ import android.os.Handler
import android.os.Looper
import android.text.TextUtils
import android.view.View
import android.widget.FrameLayout
import com.daimajia.androidanimations.library.Techniques
import com.daimajia.androidanimations.library.YoYo
import com.mints.helivideo.R
import com.mints.helivideo.ad.AdManager
import com.mints.helivideo.ad.AdStatusListener
import com.mints.helivideo.ad.NoPreAdManager
import com.mints.helivideo.ad.express.ExpressAdCallback
import com.mints.helivideo.ad.express.ExpressManager
import com.mints.helivideo.ad.express.MyExpressManager
import com.mints.helivideo.common.AppConfig
import com.mints.helivideo.common.Constant
import com.mints.helivideo.manager.UserManager
......@@ -27,6 +31,7 @@ import com.mints.helivideo.ui.widgets.NineContinueDialog
import com.mints.helivideo.utils.AppPreferencesManager
import com.mints.helivideo.utils.SpanUtils
import com.mints.helivideo.utils.TimeRender
import com.mints.helivideo.utils.UIUtils
import com.mints.helivideo.utils.rxutil.CommonRxTask
import com.mints.helivideo.utils.rxutil.RxjavaUtil
import com.mints.library.utils.nodoubleclick.AntiShake
......@@ -84,6 +89,11 @@ class MyFragment : LazyLoadBaseFragment(), MyView, View.OnClickListener {
if (AppConfig.fragmentClickFlag == Constant.FRAGMENT_CLICK_THREE) {
if (AntiShake.check(ll_my_record?.id)) return
if(userManager.vipFlag){
MyExpressManager.instance.preLoadAd()
showAd()
}
if (!TextUtils.isEmpty(userManager?.userID)) {
myPresenter.showTurn()
myPresenter.getMyInfo()
......@@ -156,7 +166,7 @@ class MyFragment : LazyLoadBaseFragment(), MyView, View.OnClickListener {
iv_my_bind.visibility = View.GONE
} else {
// 未登录
tv_my_account.text = "登录/注册"
tv_my_account.text = "绑定手机号"
iv_my_bind.visibility = View.VISIBLE
}
......@@ -380,4 +390,31 @@ class MyFragment : LazyLoadBaseFragment(), MyView, View.OnClickListener {
}
//----9宫格逻辑--结束--//
private fun showAd() {
MyExpressManager.instance.getAdView(object : ExpressAdCallback {
override fun loadSuccess(adView: FrameLayout?) {
adView?.let {
UIUtils.removeFromParent(it)
fl_ad.removeAllViews()
fl_ad.addView(it)
}
MyExpressManager.instance.preLoadAd()
}
override fun renderSuccess(adView: FrameLayout?): Boolean {
adView?.let {
UIUtils.removeFromParent(it)
fl_ad.removeAllViews()
fl_ad.addView(it)
}
MyExpressManager.instance.preLoadAd()
return false
}
override fun loadFail() {
}
})
}
}
\ No newline at end of file
......@@ -149,7 +149,7 @@
android:layout_marginRight="40dp"
android:background="@drawable/shape_red"
android:gravity="center"
android:text="立即登录"
android:text="绑定手机号"
android:textColor="@color/white"
android:textSize="20sp" />
......
......@@ -40,7 +40,7 @@
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginStart="10dp"
android:text="登录/注册"
android:text="绑定手机号"
android:textColor="#000000"
android:textSize="20sp"
android:textStyle="bold" />
......@@ -306,6 +306,12 @@
</LinearLayout>
</FrameLayout>
<com.mints.helivideo.ui.widgets.RoundRectLayout
android:id="@+id/fl_ad"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/shape_bg_write" />
</LinearLayout>
</ScrollView>
......
......@@ -50,5 +50,6 @@ GROMORE_APP_ID="5412556"
GROMORE_SPLASH_CODE="102398740"
GROMORE_VIDEO_CODE="102398300"
GROMORE_EXPRESS_CODE="102405261"
GROMORE_MYEXPRESS_CODE="102413160"
GROMORE_DRAW_CODE="102405069"
GROMORE_BANNER_CODE="102405532"
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