/* * Copyright (c) 2015 [1076559197@qq.com | tchen0707@gmail.com] * * Licensed under the Apache License, Version 2.0 (the "License”); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.youku.player.plugin; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Map; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.graphics.drawable.BitmapDrawable; import android.os.CountDownTimer; import android.os.Handler; import android.text.TextUtils; import android.view.Display; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import cn.domob.android.ads.DomobAdManager.ErrorCode; import cn.domob.android.ads.DomobPreRollAd; import cn.domob.android.ads.DomobPreRollAdListener; import cn.domob.android.ads.DomobSceneInfo; import com.baseproject.image.DiskLruCache; import com.baseproject.image.ImageCache; import com.baseproject.image.ImageResizer; import com.baseproject.image.Utils; import com.baseproject.network.YoukuAsyncTask; import com.baseproject.utils.Logger; import com.baseproject.utils.UIUtils; import com.baseproject.utils.Util; //inmobi ad import com.inmobi.commons.InMobi; import com.inmobi.monetization.IMErrorCode; import com.inmobi.monetization.IMInterstitial; import com.inmobi.monetization.IMInterstitial.State; import com.inmobi.monetization.IMInterstitialListener; //adsage ad import com.mobisage.android.MobiSageAdProductPlacement; import com.mobisage.android.MobiSageAdProductPlacementListener; import com.mobisage.android.MobiSageManager; //import com.punchbox.util.PBLog; import com.punchbox.ads.AdRequest; import com.punchbox.ads.InterstitialAd; //punchbox ad import com.punchbox.exception.PBException; import com.punchbox.listener.AdListener; import com.youku.player.Track; import com.youku.player.ad.AdForward; import com.youku.player.ad.AdVender; import com.youku.player.base.GoplayException; import com.youku.player.base.Plantform; import com.youku.player.base.YoukuBasePlayerActivity; import com.youku.player.goplay.AdvInfo; import com.youku.player.goplay.Profile; import com.youku.player.goplay.StaticsUtil; import com.youku.player.goplay.VideoAdvInfo; import com.youku.player.module.VideoUrlInfo; import com.youku.player.module.VideoUrlInfo.Source; import com.youku.player.ui.R; import com.youku.player.ui.interf.IMediaPlayerDelegate; import com.youku.player.util.DetailMessage; import com.youku.player.util.DetailUtil; import com.youku.player.util.DisposableStatsUtils; import com.youku.player.util.SessionUnitil; import com.youku.player.util.URLContainer; public class PluginImageAD extends PluginOverlay implements DetailMessage { LayoutInflater mLayoutInflater; View containerView; TextView endPage; YoukuBasePlayerActivity mActivity; IMediaPlayerDelegate mediaPlayerDelegate; private View closeBtn; private ImageView adImageView; private static Handler mHandler = new Handler(); private int mAdType = AdVender.YOUKU; private int mAdForward = AdForward.BROWSER; public boolean isOnClick = false; AdvInfo mAdvInfo = null; private boolean mIsStartToShow = false; private static final int TIME_OUT = 10000;// ms private RelativeLayout mBtnCloseWrap = null; // timer private static final int COUNTDOWN_DEFAULT = 5;// s private LinearLayout mTimerWrap; private TextView mTimerText; private AdCountDownTimer mTimer; private int mSavedCount; //html5 ad private LinearLayout mWebContainer; private WebView mAdWeb = null; private ImageAdWebViewClient mWebViewClient = null; // inmobi ad private IMInterstitial mIMAdInterstitial; private InmobiInterstListener mIMAdInListener = null; public static boolean isInmobiSDKInit = false; // mobisage ad private LinearLayout mMobisageContainer; MobiSageAdProductPlacement mMobisageAd = null; private AdMobisageListener mMobisageListener; LayoutParams mParams; public static boolean isMobiSageSDKInit = false; // PunchBox ad private static boolean isPunchBoxInit = false; private LinearLayout mPunchboxContainer; private com.punchbox.ads.InterstitialAd mPunchboxAd = null; private AdPunchBoxListener mPunchBoxListener = null; // Domob ad private RelativeLayout mDomobContainer; private DomobPreRollAd mDomobAd = null; private AdDomobPreRollListener mDomobListener = null; private int mScreenWidth; private int mScreenHeight; private boolean isDomobLandingPageOpened = false; public PluginImageAD(YoukuBasePlayerActivity context, IMediaPlayerDelegate mediaPlayerDelegate) { super(context, mediaPlayerDelegate); this.mediaPlayerDelegate = mediaPlayerDelegate; mActivity = context; mLayoutInflater = LayoutInflater.from(context); init(context); } private void init(Context context) { containerView = mLayoutInflater.inflate(R.layout.yp_plugin_image_ad, null); addView(containerView); findView(); mScreenWidth = DetailUtil.getScreenWidth(mActivity); mScreenHeight = DetailUtil.getScreenHeight(mActivity); } public void findView() { mBtnCloseWrap = (RelativeLayout) containerView.findViewById(R.id.btn_close_wrap); closeBtn = (View) containerView.findViewById(R.id.btn_close); adImageView = (ImageView) containerView .findViewById(R.id.plugin_full_ad_image); mPunchboxContainer = (LinearLayout) containerView .findViewById(R.id.ad_punchbox); closeBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { dismissImageAD(); if (mediaPlayerDelegate != null) { mediaPlayerDelegate.startPlayAfterImageAD(); } } }); adImageView.setOnClickListener(null); mWebContainer = (LinearLayout) containerView .findViewById(R.id.plugin_full_ad_webview); mTimerWrap = (LinearLayout) containerView .findViewById(R.id.image_ad_timer_wrap); mTimerText = (TextView) containerView.findViewById(R.id.image_ad_count); // init mobisage view mMobisageContainer = (LinearLayout) containerView .findViewById(R.id.ad_mobisage); // init Domob view mDomobContainer = (RelativeLayout) containerView .findViewById(R.id.ad_domobContainer); } private String TAG = "PluginImageAD"; protected VideoAdvInfo mVideoAdvInfo = null; @Override public void onBufferingUpdateListener(int percent) { } @Override public void onCompletionListener() { } @Override public boolean onErrorListener(int what, int extra) { return false; } @Override public void OnPreparedListener() { } @Override public void OnSeekCompleteListener() { } @Override public void OnVideoSizeChangedListener(int width, int height) { } @Override public void OnTimeoutListener() { } @Override public void OnCurrentPositionChangeListener(int currentPosition) { mActivity.runOnUiThread(new Runnable() { @Override public void run() { dismissImageAD(); } }); } @Override public void onLoadedListener() { } @Override public void onLoadingListener() { } @Override public void onUp() { } @Override public void onDown() { } @Override public void onFavor() { } @Override public void onUnFavor() { } @Override public void newVideo() { } @Override public void onVolumnUp() { } @Override public void onVolumnDown() { } @Override public void onMute(boolean mute) { } @Override public void onVideoChange() { firstLoaded = false; } @Override public void onVideoInfoGetting() { } @Override public void onVideoInfoGetted() { } @Override public void onVideoInfoGetFail(boolean needRetry) { } @Override public void setVisible(boolean visible) { if (visible) { containerView.setVisibility(View.VISIBLE); } else { containerView.setVisibility(View.INVISIBLE); setVisibility(View.INVISIBLE); } } @Override public void onPluginAdded() { super.onPluginAdded(); } public ImageResizer getImageWorker() { return mActivity.mImageWorker; } @Override public void onNotifyChangeVideoQuality() { } @Override public void onRealVideoStart() { } @Override public void onADplaying() { } private boolean isVideoNoAdv() { VideoUrlInfo videoInfo = mMediaPlayerDelegate.videoInfo; boolean notFromYouku = videoInfo.mSource != Source.YOUKU; if (notFromYouku) { Logger.d("PlayFlow", "PluginImageAD->isVideoNoAdv = true"); return true; } boolean isWifi = Util.isWifi(); boolean isLocalVideo = videoInfo.playType .equals(StaticsUtil.PLAY_TYPE_LOCAL); if (!isWifi && isLocalVideo) { Logger.d("PlayFlow", "PluginImageAD->isVideoNoAdv = true"); return true; } Logger.d("PlayFlow", "PluginImageAD->isVideoNoAdv = false"); return false; } /** * 开始获取广�? */ public void showAD(VideoAdvInfo videoAdvInfo) { if (!firstLoaded) { // return; } isOnClick = false; mVideoAdvInfo = videoAdvInfo; if (mMediaPlayerDelegate.isADShowing) { // return; } if (isVideoNoAdv() || Profile.from == Profile.PHONE_BROWSER) { return; } if (mMediaPlayerDelegate != null && mVideoAdvInfo != null) { int size = mVideoAdvInfo.VAL.size(); if (size == 0) { // mADURL = ""; Logger.d("PlayFlow", "全屏广告VC:为空"); dismissImageAD(); if (mediaPlayerDelegate != null) { mediaPlayerDelegate.startPlayAfterImageAD(); } return; } for (int i = 0; i < size; i++) { if (mVideoAdvInfo.VAL.get(i).AT.equals("76")) { mAdvInfo = mVideoAdvInfo.VAL.get(i); int duration = mVideoAdvInfo.VAL.get(i).AL; mSavedCount = duration; if (mVideoAdvInfo.VAL.get(i).SDKID == AdVender.YOUKU && mVideoAdvInfo.VAL.get(i).RS != null && !mVideoAdvInfo.VAL.get(i).RS.equals("")) { mADURL = mAdvInfo.RS; mADClickURL = mAdvInfo.CU; mAdForward = mAdvInfo.CUF; if (mAdvInfo.RST != null && mAdvInfo.RST.equalsIgnoreCase("html")) { setAdType(AdVender.YOUKU_HTML); } else { setAdType(AdVender.YOUKU); } mTimerText.setText(String.valueOf(mSavedCount)); showADImage(); return; } if (mVideoAdvInfo.VAL.get(i).SDKID == AdVender.INMOBI) { setAdType(AdVender.INMOBI); showADImage(); return; } if (mVideoAdvInfo.VAL.get(i).SDKID == AdVender.ADSAGE) { setAdType(AdVender.ADSAGE); showADImage(); return; } if (mVideoAdvInfo.VAL.get(i).SDKID == AdVender.DOMOB) { setAdType(AdVender.DOMOB); showADImage(); return; } if (mVideoAdvInfo.VAL.get(i).SDKID == AdVender.PUNCHBOX) { setAdType(AdVender.PUNCHBOX); showADImage(); return; } } } } dismissImageAD(); if (mediaPlayerDelegate != null) { mediaPlayerDelegate.startPlayAfterImageAD(); } } private String mADURL; private String mADClickURL; /** * 获取广告信息去加�? */ protected void showADImage() { AdvInfo advInfo = null; try { // 显示广告的时候是使用 advInfo = getAdvInfo(); if (advInfo == null) { Logger.e("PlayFlow", "全屏广告显示 SUS:为空"); return; } } catch (Exception e) { e.printStackTrace(); Logger.d("DisposableHttpTask", "全屏广告显示 SUS为空"); } finally { if (advInfo != null) { mIsStartToShow = true; if (mAdType == AdVender.YOUKU) { loadImage(adImageView, mADURL, advInfo); } else if (mAdType == AdVender.INMOBI) { startInmobiAd(); } else if (mAdType == AdVender.ADSAGE) { startMobisageAd(); } else if (mAdType == AdVender.YOUKU_HTML) { startYoukuHtml5Ad(); } else if (mAdType == AdVender.DOMOB) { startDomobAd(); } else if (mAdType == AdVender.PUNCHBOX) { startPunchBoxAd(); } } } } public void loadImage(final ImageView imageView, final String url, final AdvInfo advInfo) { new YoukuAsyncTask<Void, Void, Bitmap>() { private boolean isLoaded = false; @Override protected Bitmap doInBackground(Void... Void) { mHandler.postDelayed(new Runnable() { @Override public void run() { if (!isLoaded) { mActivity.isImageADShowing = false; if (mediaPlayerDelegate != null && !mediaPlayerDelegate.isPause) { if (StaticsUtil.PLAY_TYPE_LOCAL .equals(mediaPlayerDelegate.videoInfo .getPlayType()) && mediaPlayerDelegate.pluginManager != null && mActivity != null) { if (mActivity != null) mActivity.runOnUiThread(new Runnable() { @Override public void run() { mediaPlayerDelegate.pluginManager .onVideoInfoGetted(); mediaPlayerDelegate.pluginManager .onChangeVideo(); } }); } mediaPlayerDelegate.startPlayAfterImageAD(); } disposeAdLoss(URLContainer.AD_LOSS_STEP4); } cancel(true); } }, TIME_OUT); Bitmap bitmap = loadImageFromUrl(url); return bitmap; } @Override protected void onPostExecute(Bitmap d) { if (d == null) { return; } isLoaded = true; Logger.e("PlayFlow", "全屏广告加载成功"); mActivity.updatePlugin(DetailMessage.PLUGIN_SHOW_IMAGE_AD); imageView.setImageBitmap(d); showADImageWhenLoaded(); } }.execute(); } private Bitmap loadImageFromUrl(String url) { URL u; InputStream i = null; Bitmap d = null; DiskLruCache cache = null; try { u = new URL(url); d = getImageFromCache(url); if (d != null) { return d; } i = (InputStream) u.getContent(); } catch (Exception e) { } if (mActivity != null && mActivity.mImageWorker != null && mActivity.mImageWorker.getImageCache() != null) { cache = mActivity.mImageWorker.getImageCache().getDiskCache(); } if (cache == null) { return null; } final String fileName = Utils.urlToFileName(url); final File cacheFile = new File(cache.createFilePath(fileName)); BufferedOutputStream out = null; try { BitmapDrawable bitDrawable; bitDrawable = (BitmapDrawable) BitmapDrawable.createFromStream(i, "src"); if (bitDrawable == null) return null; d = bitDrawable.getBitmap(); if (d != null) { addImageToCache(url, d); } out = new BufferedOutputStream(new FileOutputStream(cacheFile), Utils.IO_BUFFER_SIZE); d.compress(CompressFormat.PNG, 85, out); out.flush(); } catch (final IOException e) { } catch (OutOfMemoryError e) { } finally { if (out != null) { try { out.close(); } catch (final IOException e) { Logger.e(TAG, "Error in downloadBitmap - " + e); } } } return d; } private Bitmap getImageFromCache(String url) { Bitmap d = null; ImageCache cache; if (mActivity != null && mActivity.mImageWorker != null) { cache = mActivity.mImageWorker.getImageCache(); } else { return d; } if (cache != null) { d = cache.getBitmapFromMemCache(url); if (d == null) { d = cache.getBitmapFromDiskCache(url); } } return d; } private void addImageToCache(String url, Bitmap bitmap) { ImageCache cache = null; if (mActivity != null && mActivity.mImageWorker != null) { cache = mActivity.mImageWorker.getImageCache(); } if (cache != null) { cache.addBitmapToCache(url, bitmap); } } /** * 全屏广告获取成功 去显�? */ private void showADImageWhenLoaded() { if (null != mADClickURL && TextUtils.getTrimmedLength(mADClickURL) > 0) { adImageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Logger.e("PlayFlow", "点击:" + mADClickURL); if (isOnClick) { return; } AdvInfo advInfo = getAdvInfo(); // 用户点击跳转发送CUM DisposableStatsUtils.disposeCUM(advInfo); isOnClick = true; if (mADClickURL.endsWith(".apk") && IMediaPlayerDelegate.mIDownloadApk != null && mediaPlayerDelegate != null) { if (!Util.isWifi()) { creatSelectDownloadDialog(mActivity); return; } dismissImageAD(); mediaPlayerDelegate.pluginManager.onLoading(); mediaPlayerDelegate.startPlayAfterImageAD(); } else if (mediaPlayerDelegate != null) { dismissImageAD(); mediaPlayerDelegate.pluginManager.onLoaded(); } new AdvClickProcessor().processAdvClick(mActivity, mADClickURL, mAdForward); } }); } else { adImageView.setOnClickListener(null); } if (StaticsUtil.PLAY_TYPE_LOCAL.equals(mediaPlayerDelegate.videoInfo .getPlayType()) && mediaPlayerDelegate != null && mediaPlayerDelegate.pluginManager != null) { mediaPlayerDelegate.pluginManager.onVideoInfoGetted(); mediaPlayerDelegate.pluginManager.onChangeVideo(); } if (mActivity.isFinishing()) { disposeAdLoss(URLContainer.AD_LOSS_STEP3); return; } if (Profile.PLANTFORM == Plantform.YOUKU && isLand()) { // youku客户端播放器不再挤压,横屏view尺寸需要重新初始化 mActivity.updatePlugin(PLUGIN_SHOW_IMAGE_AD); } if (UIUtils.hasKitKat()) { mActivity.setPluginHolderPaddingZero(); } mActivity.isImageADShowing = true; Track.onImageAdStart(); setVisible(true); setVisibility(View.VISIBLE); mHandler.postDelayed(new Runnable() { @Override public void run() { startTimer(); } }, 400); } /** * 获取广告信息 * * @return */ private AdvInfo getAdvInfo() { try { return mAdvInfo; // return mVideoAdvInfo.VAL.get(0); } catch (Exception e) { } return null; } /** * 不显示全屏广告蒙�? */ public void dismissImageAD() { destroyInmobiAd(); if (containerView.getVisibility() == View.VISIBLE) { mActivity.updatePlugin(PLUGIN_SHOW_NOT_SET); mActivity.runOnUiThread(new Runnable() { @Override public void run() { containerView.setVisibility(View.INVISIBLE); } }); Track.onImageAdEnd(); if (mTimer != null) { mTimer.cancel(); mTimer = null; } if (mAdWeb != null) { mWebContainer.removeAllViews(); mAdWeb.destroy(); mAdWeb = null; } if (mAdType == AdVender.YOUKU || mAdType == AdVender.YOUKU_HTML) { AdvInfo advInfo = getAdvInfo(); DisposableStatsUtils.disposeSUE(advInfo); } } if (mPunchboxAd != null) { mPunchboxAd.destroy(); mPunchboxContainer.removeAllViews(); mPunchboxAd = null; } if (mMobisageAd != null) { mMobisageAd.destoryAdView(); mMobisageContainer.removeAllViews(); mMobisageAd = null; } if (mDomobAd != null) { mDomobAd.closePreRollAd(); mDomobContainer.removeAllViews(); mDomobAd = null; } mWebViewClient = null; mSavedCount = 0; mActivity.isImageADShowing = false; mIsStartToShow = false; mAdvInfo = null; } public void destroyInmobiAd() { if (mIMAdInterstitial != null) { mIMAdInterstitial.destroy(); mIMAdInterstitial = null; mIMAdInListener = null; } } public void setMobisageAdInvisible() { if (mMobisageAd != null) { mMobisageContainer.setVisibility(View.INVISIBLE); } } public void release() { if (mActivity.isImageADShowing) { Track.onImageAdEnd(); if (mAdType == AdVender.YOUKU || mAdType == AdVender.YOUKU_HTML) { AdvInfo advInfo = getAdvInfo(); DisposableStatsUtils.disposeSUE(advInfo); } } if (mIMAdInterstitial != null) { mIMAdInterstitial.destroy(); mIMAdInterstitial = null; mIMAdInListener = null; } if (mMobisageAd != null) { mMobisageAd.destoryAdView(); mMobisageContainer.removeAllViews(); mMobisageAd = null; } if (mDomobAd != null) { mDomobAd.closePreRollAd(); mDomobContainer.removeAllViews(); mDomobAd = null; } if (mPunchboxAd != null) { mPunchboxAd.destroy(); mPunchboxContainer.removeAllViews(); mPunchboxAd = null; } if (mTimer != null) { mTimer.cancel(); mTimer = null; } if (mAdWeb != null) { mWebContainer.removeAllViews(); mAdWeb.destroy(); mAdWeb = null; } mSavedCount = 0; mActivity.isImageADShowing = false; mIsStartToShow = false; mAdvInfo = null; isInmobiSDKInit = false; isMobiSageSDKInit = false; releasePunchboxSdk(); } @Override public void onRealVideoStarted() { } @Override public void onStart() { } @Override public void onClearUpDownFav() { } @Override public void onPause() { pauseTimer(); } boolean firstLoaded = false; @Override public void back() { } @Override public void onPlayNoRightVideo(GoplayException e) { // TODO Auto-generated method stub } @Override public void onPlayReleateNoRightVideo() { // TODO Auto-generated method stub } public void setAdType(int adType) { mAdType = adType; switch (adType) { case AdVender.INMOBI: { mBtnCloseWrap.setVisibility(View.GONE); closeBtn.setVisibility(View.GONE); adImageView.setVisibility(View.GONE); mMobisageContainer.setVisibility(View.GONE); mTimerWrap.setVisibility(View.GONE); mWebContainer.setVisibility(View.GONE); mDomobContainer.setVisibility(View.GONE); mPunchboxContainer.setVisibility(View.GONE); // mInmobiAd.setVisibility(View.VISIBLE); break; } case AdVender.ADSAGE: { mBtnCloseWrap.setVisibility(View.GONE); closeBtn.setVisibility(View.GONE); adImageView.setVisibility(View.GONE); mTimerWrap.setVisibility(View.GONE); mWebContainer.setVisibility(View.GONE); mDomobContainer.setVisibility(View.GONE); mPunchboxContainer.setVisibility(View.GONE); mMobisageContainer.setVisibility(View.VISIBLE); // mInmobiAd.setVisibility(View.VISIBLE); break; } case AdVender.YOUKU_HTML: { mMobisageContainer.setVisibility(View.GONE); mPunchboxContainer.setVisibility(View.GONE); mDomobContainer.setVisibility(View.GONE); adImageView.setVisibility(View.GONE); mBtnCloseWrap.setVisibility(View.VISIBLE); closeBtn.setVisibility(View.VISIBLE); mWebContainer.setVisibility(View.VISIBLE); if (mSavedCount > 0) { mTimerWrap.setVisibility(View.VISIBLE); } else { mTimerWrap.setVisibility(View.GONE); } break; } case AdVender.DOMOB: { mBtnCloseWrap.setVisibility(View.GONE); closeBtn.setVisibility(View.GONE); adImageView.setVisibility(View.GONE); mTimerWrap.setVisibility(View.GONE); mWebContainer.setVisibility(View.GONE); mMobisageContainer.setVisibility(View.GONE); mPunchboxContainer.setVisibility(View.GONE); mDomobContainer.setVisibility(View.VISIBLE); break; } case AdVender.PUNCHBOX: { mBtnCloseWrap.setVisibility(View.GONE); adImageView.setVisibility(View.GONE); mTimerWrap.setVisibility(View.GONE); mWebContainer.setVisibility(View.GONE); mMobisageContainer.setVisibility(View.GONE); mDomobContainer.setVisibility(View.GONE); mPunchboxContainer.setVisibility(View.VISIBLE); break; } default: { mMobisageContainer.setVisibility(View.GONE); mDomobContainer.setVisibility(View.GONE); mPunchboxContainer.setVisibility(View.GONE); mWebContainer.setVisibility(View.GONE); mBtnCloseWrap.setVisibility(View.VISIBLE); closeBtn.setVisibility(View.VISIBLE); adImageView.setVisibility(View.VISIBLE); if (mSavedCount > 0) { mTimerWrap.setVisibility(View.VISIBLE); } else { mTimerWrap.setVisibility(View.GONE); } break; } } } // 当在2G/3G网络下,让用户选择是否下载 private void creatSelectDownloadDialog(Activity activity) { Dialog alertDialog = new AlertDialog.Builder(activity) .setMessage("您当前处于非WiFi网络环境,请确定是否继续下载?") .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { new AdvClickProcessor().processAdvClick(mActivity, mADClickURL, mAdForward); dismissImageAD(); if (mediaPlayerDelegate != null) { mediaPlayerDelegate.pluginManager.onLoading(); mediaPlayerDelegate.startPlayAfterImageAD(); } } }) .setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dismissImageAD(); if (mediaPlayerDelegate != null) { mediaPlayerDelegate.pluginManager.onLoading(); mediaPlayerDelegate.startPlayAfterImageAD(); } } }).create(); alertDialog.setCancelable(false); alertDialog.setCanceledOnTouchOutside(false); alertDialog.show(); } public int getAdType() { return mAdType; } public boolean isOnclick() { return isOnClick; } public boolean isSaveOnOrientChange() { if (mAdType == AdVender.YOUKU || mAdType == AdVender.YOUKU_HTML) { return true; } return false; } public boolean isStartToShow() { return mIsStartToShow; } // youku html5 ad private void startYoukuHtml5Ad() { if (mAdWeb != null) { mWebContainer.removeAllViews(); mAdWeb.destroy(); } if (mActivity == null || mActivity.isFinishing()) { disposeAdLoss(URLContainer.AD_LOSS_STEP3); return; } mAdWeb = new WebView(mActivity); mAdWeb.getSettings().setJavaScriptEnabled(true); //mAdWeb.getSettings().setUseWideViewPort(true); mAdWeb.getSettings().setLoadWithOverviewMode(true); if (mWebViewClient == null) { mWebViewClient = new ImageAdWebViewClient(); } mWebViewClient.isGetFeedBack = false; mAdWeb.setWebViewClient(mWebViewClient); mAdWeb.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (mTimer != null) { mTimer.cancel(); mTimer = null; mSavedCount = 0; mTimerWrap.setVisibility(View.GONE); } return false; } }); LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); mAdWeb.setLayoutParams(params); mWebContainer.addView(mAdWeb); try { mAdWeb.loadUrl(mADURL); } catch (Exception e) { } Logger.d("PlayFlow", "start to show youku html5 ad"); mHandler.postDelayed(new Runnable() { @Override public void run() { if (mIsStartToShow && mWebViewClient != null && !mWebViewClient.isGetFeedBack) { dismissImageAD(); if (mediaPlayerDelegate != null && !mediaPlayerDelegate.isPause) { mediaPlayerDelegate.startPlayAfterImageAD(); } } } }, TIME_OUT); } private class ImageAdWebViewClient extends WebViewClient { private boolean isGetFeedBack = false; @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); if (isGetFeedBack) { return; } mActivity.runOnUiThread(new Runnable() { @Override public void run() { if (mIsStartToShow && mediaPlayerDelegate != null && mAdType == AdVender.YOUKU_HTML) { if (Profile.PLANTFORM == Plantform.YOUKU && isLand()) { // youku客户端播放器不再挤压,横屏view尺寸需要重新初始化 mActivity.updatePlugin(PLUGIN_SHOW_IMAGE_AD); } if (UIUtils.hasKitKat()) { mActivity.setPluginHolderPaddingZero(); } setVisible(true); setVisibility(View.VISIBLE); mActivity.isImageADShowing = true; isGetFeedBack = true; Track.onImageAdStart(); startTimer(); } else { disposeAdLoss(URLContainer.AD_LOSS_STEP3); } } }); } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { // TODO Auto-generated method stub super.onPageStarted(view, url, favicon); } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { mActivity.isImageADShowing = false; mIsStartToShow = false; isGetFeedBack = true; disposeAdLoss(URLContainer.AD_LOSS_STEP4); if (mediaPlayerDelegate != null) { mediaPlayerDelegate.startPlayAfterImageAD(); } super.onReceivedError(view, errorCode, description, failingUrl); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Logger.e("PlayFlow", "点击:" + url); AdvInfo advInfo = getAdvInfo(); // 用户点击跳转发送CUM if (!isOnClick) { DisposableStatsUtils.disposeCUM(advInfo); } isOnClick = true; if (url.endsWith(".apk") && IMediaPlayerDelegate.mIDownloadApk != null && mediaPlayerDelegate != null) { if (!Util.isWifi()) { creatSelectDownloadDialog(mActivity); return true; } dismissImageAD(); mediaPlayerDelegate.pluginManager.onLoading(); mediaPlayerDelegate.startPlayAfterImageAD(); } else if (mediaPlayerDelegate != null) { dismissImageAD(); mediaPlayerDelegate.pluginManager.onLoaded(); } new AdvClickProcessor().processAdvClick(mActivity, url, mAdForward); return true; } } // Inmobi ad related private void startInmobiAd() { if (mediaPlayerDelegate != null && mediaPlayerDelegate.isFullScreen) { if (mActivity == null || mActivity.isFinishing()) { disposeAdLoss(URLContainer.AD_LOSS_STEP3); return; } if (!isInmobiSDKInit) { InMobi.initialize(mActivity, AdVender.Inmobi_ID); isInmobiSDKInit = true; } mIMAdInterstitial = new IMInterstitial(mActivity, AdVender.Inmobi_Interstitial_ID); if (mIMAdInListener == null) { mIMAdInListener = new InmobiInterstListener(); } mIMAdInListener.isGetFeedBack = false; mIMAdInterstitial.setIMInterstitialListener(mIMAdInListener); Logger.d("PlayFlow", "start to show inmobi ad"); AdvInfo advInfo = getAdvInfo(); DisposableStatsUtils.disposeSUS(advInfo); mIMAdInterstitial.loadInterstitial(); mHandler.postDelayed(new Runnable() { @Override public void run() { if (mIsStartToShow && mIMAdInListener != null && !mIMAdInListener.isGetFeedBack) { dismissImageAD(); if (mediaPlayerDelegate != null && !mediaPlayerDelegate.isPause) { mediaPlayerDelegate.startPlayAfterImageAD(); } } } }, TIME_OUT); } else { dismissImageAD(); if (mediaPlayerDelegate != null) { mediaPlayerDelegate.startPlayAfterImageAD(); } } } private class InmobiInterstListener implements IMInterstitialListener { public boolean isGetFeedBack = false; @Override public void onDismissInterstitialScreen(IMInterstitial arg0) { if (mActivity.isImageADShowing && !mActivity.onPause) { mActivity.isImageADShowing = false; mIsStartToShow = false; isGetFeedBack = true; Track.onImageAdEnd(); // mActivity.updatePlugin(PLUGIN_SHOW_NOT_SET); if (mediaPlayerDelegate != null) { if (mediaPlayerDelegate.pluginManager != null) { mediaPlayerDelegate.pluginManager.onLoaded(); } mediaPlayerDelegate.startPlayAfterImageAD(); } ; } } @Override public void onInterstitialFailed(IMInterstitial arg0, IMErrorCode arg1) { mActivity.isImageADShowing = false; mIsStartToShow = false; isGetFeedBack = true; disposeAdLoss(URLContainer.AD_LOSS_STEP4); if (mediaPlayerDelegate != null) { mediaPlayerDelegate.startPlayAfterImageAD(); } } @Override public void onInterstitialInteraction(IMInterstitial arg0, Map<String, String> arg1) { // TODO Auto-generated method stub } @Override public void onInterstitialLoaded(IMInterstitial arg0) { if (mIsStartToShow && mAdType == AdVender.INMOBI && mIMAdInterstitial != null && mIMAdInterstitial.getState() == State.READY && mediaPlayerDelegate != null && mediaPlayerDelegate.isFullScreen) { setVisible(true); setVisibility(View.VISIBLE); mIMAdInterstitial.show(); mActivity.isImageADShowing = true; isGetFeedBack = true; Track.onImageAdStart(); } else { disposeAdLoss(URLContainer.AD_LOSS_STEP3); } } @Override public void onLeaveApplication(IMInterstitial arg0) { // TODO Auto-generated method stub } @Override public void onShowInterstitialScreen(IMInterstitial arg0) { // TODO Auto-generated method stub } }; // mobisage ad private void startMobisageAd() { if (mMobisageAd != null) { mMobisageAd.destoryAdView(); mMobisageContainer.removeAllViews(); } if (mActivity == null || mActivity.isFinishing()) { disposeAdLoss(URLContainer.AD_LOSS_STEP3); return; } if (!isMobiSageSDKInit) { MobiSageManager.getInstance().setPublisherID(mActivity, AdVender.MobiSage_ID); isMobiSageSDKInit = true; } mMobisageAd = new MobiSageAdProductPlacement(mActivity, true); if (mMobisageListener == null) { mMobisageListener = new AdMobisageListener(); } mMobisageListener.isGetFeedBack = false; mMobisageAd.setMobiSageAdProductPlacementListener(mMobisageListener); if (mParams == null) { mParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); } mMobisageAd.setLayoutParams(mParams); mMobisageContainer.addView(mMobisageAd, mParams); Logger.d("PlayFlow", "start to show adsage ad"); AdvInfo advInfo = getAdvInfo(); DisposableStatsUtils.disposeSUS(advInfo); mHandler.postDelayed(new Runnable() { @Override public void run() { if (mIsStartToShow && mMobisageListener != null && !mMobisageListener.isGetFeedBack) { dismissImageAD(); if (mediaPlayerDelegate != null && !mediaPlayerDelegate.isPause) { mediaPlayerDelegate.startPlayAfterImageAD(); } } } }, TIME_OUT); } private class AdMobisageListener implements MobiSageAdProductPlacementListener { public boolean isGetFeedBack = false; @Override public void onMobiSageProductPlacementClick( MobiSageAdProductPlacement arg0) { // TODO Auto-generated method stub } @Override public void onMobiSageProductPlacementClose( MobiSageAdProductPlacement arg0) { if (mActivity.isImageADShowing) { mActivity.isImageADShowing = false; mIsStartToShow = false; isGetFeedBack = true; Track.onImageAdEnd(); if (mediaPlayerDelegate != null) { mediaPlayerDelegate.startPlayAfterImageAD(); } } } @Override public void onMobiSageProductPlacementError( MobiSageAdProductPlacement arg0) { mActivity.isImageADShowing = false; mIsStartToShow = false; isGetFeedBack = true; disposeAdLoss(URLContainer.AD_LOSS_STEP4); if (mediaPlayerDelegate != null) { mediaPlayerDelegate.startPlayAfterImageAD(); } } @Override public void onMobiSageProductPlacementHide( MobiSageAdProductPlacement arg0) { // TODO Auto-generated method stub } @Override public void onMobiSageProductPlacementHideWindow( MobiSageAdProductPlacement arg0) { // TODO Auto-generated method stub } @Override public void onMobiSageProductPlacementPopupWindow( MobiSageAdProductPlacement arg0) { // TODO Auto-generated method stub } @Override public void onMobiSageProductPlacementShow( MobiSageAdProductPlacement arg0) { mActivity.runOnUiThread(new Runnable() { @Override public void run() { if (mIsStartToShow && mediaPlayerDelegate != null && mAdType == AdVender.ADSAGE) { setVisible(true); setVisibility(View.VISIBLE); mActivity.isImageADShowing = true; isGetFeedBack = true; Track.onImageAdStart(); } else { disposeAdLoss(URLContainer.AD_LOSS_STEP3); } } }); } } // Domob ad private void startDomobAd() { if (mDomobAd != null) { mDomobAd.closePreRollAd(); mMobisageContainer.removeAllViews(); } if (mActivity == null || mActivity.isFinishing()) { disposeAdLoss(URLContainer.AD_LOSS_STEP3); return; } mDomobAd = new DomobPreRollAd(mActivity, AdVender.Domob_ID, AdVender.Domob_PreAd_ID, mScreenWidth, mScreenHeight); if (mDomobListener == null) { mDomobListener = new AdDomobPreRollListener(); } mDomobListener.isGetFeedBack = false; mDomobAd.setProRollAdListener(mDomobListener); mDomobAd.setCountdownTotalSeconds(mSavedCount > 0 ? mSavedCount : COUNTDOWN_DEFAULT); mDomobAd.loadPreRollAd(); Logger.d("PlayFlow", "start to show Domob image ad"); AdvInfo advInfo = getAdvInfo(); DisposableStatsUtils.disposeSUS(advInfo); mHandler.postDelayed(new Runnable() { @Override public void run() { if (mIsStartToShow && mDomobListener != null && !mDomobListener.isGetFeedBack) { dismissImageAD(); if (mediaPlayerDelegate != null && !mediaPlayerDelegate.isPause) { mediaPlayerDelegate.startPlayAfterImageAD(); } } } }, TIME_OUT); } private class AdDomobPreRollListener implements DomobPreRollAdListener { public boolean isGetFeedBack = false; @Override public void onPreRollAdReady() { if (mDomobAd != null && mIsStartToShow && mAdType == AdVender.DOMOB) { mDomobAd.showPreRollAd(getSceneInfo()); } else { disposeAdLoss(URLContainer.AD_LOSS_STEP3); } } @Override public void onPreRollAdPresent() { mActivity.runOnUiThread(new Runnable() { @Override public void run() { if (mIsStartToShow && mediaPlayerDelegate != null && mAdType == AdVender.DOMOB) { setVisible(true); setVisibility(View.VISIBLE); mActivity.isImageADShowing = true; isGetFeedBack = true; Track.onImageAdStart(); } else { disposeAdLoss(URLContainer.AD_LOSS_STEP3); } } }); } @Override public void onPreRollAdLeaveApplication() { } @Override public void onPreRollAdFailed(ErrorCode code) { mActivity.isImageADShowing = false; mIsStartToShow = false; isGetFeedBack = true; disposeAdLoss(URLContainer.AD_LOSS_STEP4); if (mediaPlayerDelegate != null) { mediaPlayerDelegate.startPlayAfterImageAD(); } } @Override public void onPreRollAdDismiss() { if (mActivity.isImageADShowing) { mActivity.isImageADShowing = false; mIsStartToShow = false; isGetFeedBack = true; Track.onImageAdEnd(); if (mediaPlayerDelegate != null) { mediaPlayerDelegate.startPlayAfterImageAD(); } } } @Override public void onPreRollAdClicked() { } @Override public void onLandingPageOpen() { isDomobLandingPageOpened = true; } @Override public void onLandingPageClose() { isDomobLandingPageOpened = false; if (mActivity.isImageADShowing) { mActivity.isImageADShowing = false; mIsStartToShow = false; isGetFeedBack = true; Track.onImageAdEnd(); mediaPlayerDelegate.pluginManager.onLoading(); if (mediaPlayerDelegate != null) { mediaPlayerDelegate.startPlayAfterImageAD(); } } } } private DomobSceneInfo getSceneInfo() { DomobSceneInfo sceneInfo = new DomobSceneInfo(); sceneInfo.setContext(mActivity); sceneInfo.setCoordinatesX(0); sceneInfo.setCoordinatesY(0); sceneInfo.setParentViewGroup(mDomobContainer); sceneInfo.setSceneId("sceneId"); int frameWidth = getWidth(); int frameHeight = getHeight(); sceneInfo.setSecureAreaWidth(frameWidth); sceneInfo.setSecureAreaHeight(frameHeight); return sceneInfo; } public boolean isDomobLandingPageOpened() { return isDomobLandingPageOpened; } private void startPunchBoxAd() { if (mPunchboxAd != null) { mPunchboxAd.dismiss(); mPunchboxContainer.removeAllViews(); } initPunchboxSdk(); if (mActivity == null || mActivity.isFinishing()) { disposeAdLoss(URLContainer.AD_LOSS_STEP3); return; } mPunchboxAd = new InterstitialAd(mActivity); if (mPunchBoxListener == null) { mPunchBoxListener = new AdPunchBoxListener(); } else { mPunchBoxListener.isGetFeedBack = false; } mPunchboxAd.setAdListener(mPunchBoxListener); mPunchboxAd.setCloseMode(2); mPunchboxAd.setDisplayTime(mSavedCount > 0 ? mSavedCount : COUNTDOWN_DEFAULT); mPunchboxAd.donotReloadAfterClose(); AdRequest adRequest = new AdRequest(); adRequest.setOrientation(2); mPunchboxAd.loadAd(adRequest); Logger.d("PlayFlow", "start to show punchbox fullscreen ad"); AdvInfo advInfo = getAdvInfo(); DisposableStatsUtils.disposePausedSUS(advInfo); mHandler.postDelayed(new Runnable() { @Override public void run() { if (mIsStartToShow && mPunchBoxListener != null && !mPunchBoxListener.isGetFeedBack) { dismissImageAD(); if (mediaPlayerDelegate != null && !mediaPlayerDelegate.isPause) { mediaPlayerDelegate.startPlayAfterImageAD(); } } } }, TIME_OUT); } private class AdPunchBoxListener implements AdListener { public boolean isGetFeedBack = false; @Override public void onDismissScreen() { if (mActivity.onPause) { isGetFeedBack = true; Track.onImageAdEnd(); return; } if (mActivity.isImageADShowing) { mActivity.isImageADShowing = false; mIsStartToShow = false; isGetFeedBack = true; Track.onImageAdEnd(); mediaPlayerDelegate.pluginManager.onLoading(); if (mediaPlayerDelegate != null) { mediaPlayerDelegate.startPlayAfterImageAD(); } } } @Override public void onFailedToReceiveAd(PBException arg0) { Logger.d("PlayFlow", "punchbox onFailedToReceiveAd"); mActivity.isImageADShowing = false; mIsStartToShow = false; isGetFeedBack = true; disposeAdLoss(URLContainer.AD_LOSS_STEP4); if (mediaPlayerDelegate != null) { mediaPlayerDelegate.startPlayAfterImageAD(); } } @Override public void onPresentScreen() { mActivity.runOnUiThread(new Runnable() { @Override public void run() { if (mIsStartToShow && mediaPlayerDelegate != null && mAdType == AdVender.PUNCHBOX) { setVisible(true); setVisibility(View.VISIBLE); mActivity.isImageADShowing = true; isGetFeedBack = true; Track.onImageAdStart(); } else { disposeAdLoss(URLContainer.AD_LOSS_STEP3); } } }); } @Override public void onReceiveAd() { try { if (mPunchboxAd!=null && mPunchboxAd.isReady()) { mPunchboxAd.show(mPunchboxContainer, null); } } catch (PBException e) { disposeAdLoss(URLContainer.AD_LOSS_STEP3); // 当设置的scale不在范围内,或者isReady()属性为false e.printStackTrace(); } } } public static void initPunchboxSdk() { if (isPunchBoxInit) { return; } //PBLog.LOG_ENABLED = false; isPunchBoxInit = true; } public static void releasePunchboxSdk() { isPunchBoxInit = false; } private void disposeAdLoss(int step) { DisposableStatsUtils.disposeAdLoss(mActivity, step, SessionUnitil.playEvent_session, URLContainer.AD_LOSS_MF); } public void pauseTimer() { if (mTimer != null) { mTimer.cancel(); mTimer = null; } } public void startTimer() { if ((mAdType == AdVender.YOUKU || mAdType == AdVender.YOUKU_HTML) && mSavedCount > 0 && mActivity.isImageADShowing) { mTimer = new AdCountDownTimer(mSavedCount * 1000, 100); mTimer.start(); } } private class AdCountDownTimer extends CountDownTimer { public AdCountDownTimer(long millisInFuture, long countDownInterval) { super(millisInFuture, countDownInterval); mSavedCount = (int)millisInFuture/1000; } @Override public void onFinish() { dismissImageAD(); if (mediaPlayerDelegate != null) { mediaPlayerDelegate.pluginManager.onLoading(); mediaPlayerDelegate.startPlayAfterImageAD(); } } @Override public void onTick(long millisUntilFinished) { synchronized (mTimerText) { float time = (float) millisUntilFinished / 1000; int count = Math.round(time); if (mSavedCount != count && count > 0) { mSavedCount = count; mTimerText.setText(String.valueOf(mSavedCount)); } } } } private boolean isLand() { if (mActivity != null) { Display getOrient = mActivity.getWindowManager() .getDefaultDisplay(); return getOrient.getWidth() > getOrient.getHeight(); } return false; } }