package com.adsdk.sdk.video; import java.lang.ref.WeakReference; import java.util.Iterator; import java.util.Set; import java.util.Timer; import java.util.TimerTask; import java.util.Vector; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.graphics.Color; import android.media.AudioManager; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import android.media.MediaPlayer.OnErrorListener; import android.media.MediaPlayer.OnInfoListener; import android.media.MediaPlayer.OnPreparedListener; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.Display; import android.view.Gravity; import android.view.KeyEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup.LayoutParams; import android.view.Window; import android.view.WindowManager; import android.webkit.WebChromeClient; import android.webkit.WebChromeClient.CustomViewCallback; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; import android.widget.VideoView; import com.adsdk.sdk.AdManager; import com.adsdk.sdk.Const; import com.adsdk.sdk.Util; import com.adsdk.sdk.video.InterstitialController.OnResetAutocloseListener; import com.adsdk.sdk.video.MediaController.OnPauseListener; import com.adsdk.sdk.video.MediaController.OnReplayListener; import com.adsdk.sdk.video.MediaController.OnUnpauseListener; import com.adsdk.sdk.video.SDKVideoView.OnStartListener; import com.adsdk.sdk.video.SDKVideoView.OnTimeEventListener; import com.adsdk.sdk.video.WebViewClient.OnPageLoadedListener; public class RichMediaActivity extends Activity { class CanSkipTask extends TimerTask { private final RichMediaActivity mActivity; public CanSkipTask(final RichMediaActivity activity) { this.mActivity = activity; } @Override public void run() { this.mActivity.mCanClose = true; if (this.mActivity.mSkipButton != null) this.mActivity.runOnUiThread(new Runnable() { @Override public void run() { CanSkipTask.this.mActivity.mSkipButton .setVisibility(View.VISIBLE); } }); } } class InterstitialAutocloseTask extends TimerTask { private final Activity mActivity; public InterstitialAutocloseTask(final Activity activity) { this.mActivity = activity; } @Override public void run() { RichMediaActivity.this.mResult = true; this.mActivity.runOnUiThread(new Runnable() { @Override public void run() { RichMediaActivity.this.setResult(Activity.RESULT_OK); RichMediaActivity.this.finish(); } }); } } class InterstitialLoadingTimeoutTask extends TimerTask { @Override public void run() { RichMediaActivity.this.mCanClose = true; RichMediaActivity.this.mInterstitialController.pageLoaded(); } } class VideoTimeoutTask extends TimerTask { private final Activity mActivity; public VideoTimeoutTask(final Activity activity) { this.mActivity = activity; } @Override public void run() { this.mActivity.runOnUiThread(new Runnable() { @Override public void run() { VideoTimeoutTask.this.mActivity.finish(); } }); } } public static final int TYPE_UNKNOWN = -1; public static final int TYPE_BROWSER = 0; public static final int TYPE_VIDEO = 1; public static final int TYPE_INTERSTITIAL = 2; public static void setActivityAnimation(final Activity activity, final int in, final int out) { try { activity.overridePendingTransition(in, out); } catch (final Exception e) { } } private ResourceManager mResourceManager; private FrameLayout mRootLayout; private FrameLayout mVideoLayout; private FrameLayout mLoadingView; private FrameLayout mCustomView; private VideoView mCustomVideoView; private WebChromeClient.CustomViewCallback mCustomViewCallback; private SDKVideoView mVideoView; private WebFrame mOverlayView; private WebFrame mInterstitialView; private WebFrame mWebBrowserView; private MediaController mMediaController; private ImageView mSkipButton; private InterstitialController mInterstitialController; private RichMediaAd mAd; private VideoData mVideoData; private InterstitialData mInterstitialData; private Uri uri; private Timer mInterstitialLoadingTimer; private Timer mInterstitialAutocloseTimer; private Timer mInterstitialCanCloseTimer; private Timer mVideoTimeoutTimer; private int mWindowWidth; private int mWindowHeight; private int mVideoLastPosition; private int mVideoWidth; private int mVideoHeight; private boolean mCanClose; protected boolean mInterstitialAutocloseReset; private boolean mPageLoaded = false; private int mType; private int mEnterAnim; private int mExitAnim; private boolean mResult; DisplayMetrics metrics; int paddingArg = 5; int marginArg = 8; int skipButtonSizeLand = 50; int skipButtonSizePort = 40; static class ResourceHandler extends Handler { WeakReference<RichMediaActivity> richMediaActivity; public ResourceHandler(RichMediaActivity activity) { richMediaActivity = new WeakReference<RichMediaActivity>(activity); } @Override public void handleMessage(final Message msg) { RichMediaActivity wRichMediaActivity = richMediaActivity.get(); if(wRichMediaActivity!=null){ wRichMediaActivity.handleMessage(msg); } } }; public void handleMessage(final Message msg) { switch (msg.what) { case ResourceManager.RESOURCE_LOADED_MSG: switch (msg.arg1) { case ResourceManager.DEFAULT_SKIP_IMAGE_RESOURCE_ID: if (RichMediaActivity.this.mSkipButton != null) if (mResourceManager.containsResource(ResourceManager.DEFAULT_SKIP_IMAGE_RESOURCE_ID)) { RichMediaActivity.this.mSkipButton .setImageDrawable(mResourceManager .getResource(this,ResourceManager.DEFAULT_SKIP_IMAGE_RESOURCE_ID)); } else { RichMediaActivity.this.mSkipButton .setImageDrawable(mResourceManager .getResource(this,ResourceManager.DEFAULT_SKIP_IMAGE_RESOURCE_ID)); } break; } break; } } private final OnTimeEventListener mOverlayShowListener = new OnTimeEventListener() { @Override public void onTimeEvent(final int time) { if (RichMediaActivity.this.mOverlayView != null) { RichMediaActivity.this.mOverlayView .setVisibility(View.VISIBLE); RichMediaActivity.this.mOverlayView.requestLayout(); } } }; private final OnClickListener mOverlayClickListener = new OnClickListener() { @Override public void onClick(final View arg0) { if (RichMediaActivity.this.mMediaController != null) RichMediaActivity.this.mMediaController.toggle(); } }; OnErrorListener mOnVideoErrorListener = new OnErrorListener() { @Override public boolean onError(final MediaPlayer mp, final int what, final int extra) { finish(); return false; } }; protected int mTimeTest; OnInfoListener mOnVideoInfoListener = new OnInfoListener() { @Override public boolean onInfo(final MediaPlayer mp, final int what, final int extra) { if(what == 703){ mTimeTest = mVideoView.getCurrentPosition(); new Handler().postDelayed(mCheckProgressTask, 5000); } return false; } }; private Runnable mCheckProgressTask = new Runnable() { public void run() { int test = mVideoView.getCurrentPosition(); if(test - mTimeTest <= 1){ finish(); } } }; OnPreparedListener mOnVideoPreparedListener = new OnPreparedListener() { @Override public void onPrepared(final MediaPlayer mp) { if (RichMediaActivity.this.mVideoTimeoutTimer != null) { RichMediaActivity.this.mVideoTimeoutTimer.cancel(); RichMediaActivity.this.mVideoTimeoutTimer = null; } if (RichMediaActivity.this.mLoadingView != null) RichMediaActivity.this.mLoadingView .setVisibility(View.GONE); if(mVideoData.showNavigationBars) mMediaController.setVisibility(View.VISIBLE); RichMediaActivity.this.mVideoView.requestFocus(); } }; OnCompletionListener mOnVideoCompletionListener = new OnCompletionListener() { @Override public void onCompletion(final MediaPlayer mp) { final Vector<String> trackers = RichMediaActivity.this.mVideoData.completeEvents; for (int i = 0; i < trackers.size(); i++) { final TrackEvent event = new TrackEvent(); event.url = trackers.get(i); event.timestamp = System.currentTimeMillis(); TrackerService.requestTrack(event); } if (RichMediaActivity.this.mType == RichMediaActivity.TYPE_VIDEO && RichMediaActivity.this.mAd.getType() == Const.VIDEO_TO_INTERSTITIAL) { final Intent intent = new Intent(RichMediaActivity.this, RichMediaActivity.class); intent.putExtra(Const.AD_EXTRA, RichMediaActivity.this.mAd); intent.putExtra(Const.AD_TYPE_EXTRA, RichMediaActivity.TYPE_INTERSTITIAL); try { RichMediaActivity.this.startActivity(intent); RichMediaActivity.setActivityAnimation( RichMediaActivity.this, RichMediaActivity.this.mEnterAnim, RichMediaActivity.this.mExitAnim); } catch (final Exception e) { } } RichMediaActivity.this.mResult = true; RichMediaActivity.this.setResult(Activity.RESULT_OK); RichMediaActivity.this.finish(); } }; OnStartListener mOnVideoStartListener = new OnStartListener() { @Override public void onVideoStart() { final Vector<String> trackers = RichMediaActivity.this.mVideoData.startEvents; for (int i = 0; i < trackers.size(); i++) { final TrackEvent event = new TrackEvent(); event.url = trackers.get(i); event.timestamp = System.currentTimeMillis(); TrackerService.requestTrack(event); } } }; OnPauseListener mOnVideoPauseListener = new OnPauseListener() { @Override public void onVideoPause() { final Vector<String> trackers = RichMediaActivity.this.mVideoData.pauseEvents; for (int i = 0; i < trackers.size(); i++) { final TrackEvent event = new TrackEvent(); event.url = trackers.get(i); event.timestamp = System.currentTimeMillis(); TrackerService.requestTrack(event); } } }; OnUnpauseListener mOnVideoUnpauseListener = new OnUnpauseListener() { @Override public void onVideoUnpause() { final Vector<String> trackers = RichMediaActivity.this.mVideoData.unpauseEvents; for (int i = 0; i < trackers.size(); i++) { final TrackEvent event = new TrackEvent(); event.url = trackers.get(i); event.timestamp = System.currentTimeMillis(); TrackerService.requestTrack(event); } } }; OnTimeEventListener mOnVideoTimeEventListener = new OnTimeEventListener() { @Override public void onTimeEvent(final int time) { final Vector<String> trackers = RichMediaActivity.this.mVideoData.timeTrackingEvents .get(time); if (trackers != null) for (int i = 0; i < trackers.size(); i++) { final TrackEvent event = new TrackEvent(); event.url = trackers.get(i); event.timestamp = System.currentTimeMillis(); TrackerService.requestTrack(event); } } }; OnTimeEventListener mOnVideoCanCloseEventListener = new OnTimeEventListener() { @Override public void onTimeEvent(final int time) { RichMediaActivity.this.mCanClose = true; if (RichMediaActivity.this.mVideoData.showSkipButton && RichMediaActivity.this.mSkipButton != null) { RichMediaActivity.this.mSkipButton .setImageDrawable(mResourceManager .getResource(RichMediaActivity.this,ResourceManager.DEFAULT_SKIP_IMAGE_RESOURCE_ID)); RichMediaActivity.this.mSkipButton .setVisibility(View.VISIBLE); } } }; OnClickListener mOnVideoSkipListener = new OnClickListener() { @Override public void onClick(final View v) { final Vector<String> trackers = RichMediaActivity.this.mVideoData.skipEvents; for (int i = 0; i < trackers.size(); i++) { final TrackEvent event = new TrackEvent(); event.url = trackers.get(i); event.timestamp = System.currentTimeMillis(); TrackerService.requestTrack(event); } RichMediaActivity.this.mResult = true; RichMediaActivity.this.setResult(Activity.RESULT_OK); RichMediaActivity.this.finish(); } }; OnReplayListener mOnVideoReplayListener = new OnReplayListener() { @Override public void onVideoReplay() { final Vector<String> trackers = RichMediaActivity.this.mVideoData.replayEvents; for (int i = 0; i < trackers.size(); i++) { final TrackEvent event = new TrackEvent(); event.url = trackers.get(i); event.timestamp = System.currentTimeMillis(); TrackerService.requestTrack(event); } } }; private final OnClickListener mInterstitialClickListener = new OnClickListener() { @Override public void onClick(final View arg0) { if (RichMediaActivity.this.mInterstitialController != null) { RichMediaActivity.this.mInterstitialController.toggle(); RichMediaActivity.this.mInterstitialController .resetAutoclose(); } } }; OnClickListener mOnInterstitialSkipListener = new OnClickListener() { @Override public void onClick(final View v) { RichMediaActivity.this.mResult = true; RichMediaActivity.this.setResult(Activity.RESULT_OK); RichMediaActivity.this.finish(); } }; OnResetAutocloseListener mOnResetAutocloseListener = new OnResetAutocloseListener() { @Override public void onResetAutoclose() { RichMediaActivity.this.mInterstitialAutocloseReset = true; if (RichMediaActivity.this.mInterstitialAutocloseTimer != null) { RichMediaActivity.this.mInterstitialAutocloseTimer .cancel(); RichMediaActivity.this.mInterstitialAutocloseTimer = null; } } }; OnPageLoadedListener mOnInterstitialLoadedListener = new OnPageLoadedListener() { @Override public void onPageLoaded() { if (RichMediaActivity.this.mInterstitialData != null && RichMediaActivity.this.mInterstitialData.autoclose > 0) if (RichMediaActivity.this.mInterstitialAutocloseTimer == null && !RichMediaActivity.this.mInterstitialAutocloseReset) { final InterstitialAutocloseTask autocloseTask = new InterstitialAutocloseTask( RichMediaActivity.this); RichMediaActivity.this.mInterstitialAutocloseTimer = new Timer(); RichMediaActivity.this.mInterstitialAutocloseTimer .schedule( autocloseTask, RichMediaActivity.this.mInterstitialData.autoclose * 1000); } if (RichMediaActivity.this.mInterstitialData != null && RichMediaActivity.this.mInterstitialData.showSkipButtonAfter > 0) { if (RichMediaActivity.this.mInterstitialCanCloseTimer == null) { final CanSkipTask skipTask = new CanSkipTask( RichMediaActivity.this); RichMediaActivity.this.mInterstitialCanCloseTimer = new Timer(); RichMediaActivity.this.mInterstitialCanCloseTimer .schedule( skipTask, RichMediaActivity.this.mInterstitialData.showSkipButtonAfter * 1000); } } else RichMediaActivity.this.mCanClose = true; if (RichMediaActivity.this.mInterstitialLoadingTimer != null) { RichMediaActivity.this.mInterstitialLoadingTimer.cancel(); RichMediaActivity.this.mInterstitialLoadingTimer = null; } RichMediaActivity.this.mPageLoaded = true; RichMediaActivity.this.mInterstitialController.pageLoaded(); } }; OnPageLoadedListener mOnWebBrowserLoadedListener = new OnPageLoadedListener() { @Override public void onPageLoaded() { RichMediaActivity.this.mPageLoaded = true; } }; private ResourceHandler mHandler; @Override public void finish() { if (this.mAd != null){ switch (this.mType) { case TYPE_VIDEO: if (this.mAd.getType() == Const.VIDEO) AdManager.closeRunningAd(this.mAd, this.mResult); else if (this.mAd.getType() == Const.VIDEO_TO_INTERSTITIAL && !this.mResult) AdManager.closeRunningAd(this.mAd, this.mResult); break; case TYPE_INTERSTITIAL: if (this.mAd.getType() == Const.INTERSTITIAL || this.mAd.getType() == Const.VIDEO_TO_INTERSTITIAL || this.mAd.getType() == Const.INTERSTITIAL_TO_VIDEO) AdManager.closeRunningAd(this.mAd, this.mResult); break; } } super.finish(); RichMediaActivity.setActivityAnimation(this, this.mEnterAnim, this.mExitAnim); } public int getDipSize(final int argSize) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, argSize, this.getResources().getDisplayMetrics()); } public FrameLayout getRootLayout() { return this.mRootLayout; } public void goBack() { if (this.mCustomView != null) { this.onHideCustomView(); return; } switch (this.mType) { case TYPE_VIDEO: if (this.mCanClose) this.finish(); break; case TYPE_INTERSTITIAL: if (this.mInterstitialView.canGoBack()) this.mInterstitialView.goBack(); else if (this.mCanClose) { this.mResult = true; this.setResult(Activity.RESULT_OK); this.finish(); } break; case TYPE_BROWSER: if (this.mWebBrowserView.canGoBack()) this.mWebBrowserView.goBack(); else this.finish(); break; } } private void initInterstitialView() { this.mInterstitialData = this.mAd.getInterstitial(); this.mInterstitialAutocloseReset = false; this.setRequestedOrientation(this.mInterstitialData.orientation); final FrameLayout layout = new FrameLayout(this); this.mInterstitialView = new WebFrame(this, true, false, false); this.mInterstitialView.setBackgroundColor(Color.TRANSPARENT); this.mInterstitialView .setOnPageLoadedListener(this.mOnInterstitialLoadedListener); this.mInterstitialController = new InterstitialController(this, this.mInterstitialData); this.mInterstitialController.setBrowser(this.mInterstitialView); this.mInterstitialController.setBrowserView(this.mInterstitialView); this.mInterstitialController .setOnResetAutocloseListener(this.mOnResetAutocloseListener); layout.addView(this.mInterstitialController, new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, Gravity.CENTER)); if (this.mInterstitialData.showNavigationBars) this.mInterstitialController.show(0); if (this.mInterstitialData.showSkipButton) { this.mSkipButton = new ImageView(this); this.mSkipButton.setAdjustViewBounds(false); FrameLayout.LayoutParams params = null; int buttonSize = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, this.skipButtonSizeLand, this .getResources().getDisplayMetrics()); int size = Math.min(this.getResources().getDisplayMetrics().widthPixels,this.getResources().getDisplayMetrics().heightPixels); buttonSize = (int)(size*0.1); params = new FrameLayout.LayoutParams(buttonSize, buttonSize, Gravity.TOP | Gravity.RIGHT); if (this.mInterstitialData.orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) { final int margin = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, 8, this.getResources() .getDisplayMetrics()); params.topMargin = margin; params.rightMargin = margin; } else { final int margin = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, 10, this.getResources() .getDisplayMetrics()); params.topMargin = margin; params.rightMargin = margin; } if (this.mInterstitialData.skipButtonImage != null && this.mInterstitialData.skipButtonImage.length() > 0) { this.mSkipButton.setBackgroundDrawable(null); this.mResourceManager.fetchResource(this, this.mInterstitialData.skipButtonImage, ResourceManager.DEFAULT_SKIP_IMAGE_RESOURCE_ID); } else this.mSkipButton .setImageDrawable(mResourceManager .getResource(this,ResourceManager.DEFAULT_SKIP_IMAGE_RESOURCE_ID)); this.mSkipButton .setOnClickListener(this.mOnInterstitialSkipListener); if (this.mInterstitialData.showSkipButtonAfter > 0) { this.mCanClose = false; this.mSkipButton.setVisibility(View.GONE); if (this.mInterstitialLoadingTimer == null) { final InterstitialLoadingTimeoutTask loadingTimeoutTask = new InterstitialLoadingTimeoutTask(); this.mInterstitialLoadingTimer = new Timer(); this.mInterstitialLoadingTimer.schedule(loadingTimeoutTask, Const.CONNECTION_TIMEOUT); } } else { this.mCanClose = true; this.mSkipButton.setVisibility(View.VISIBLE); } layout.addView(this.mSkipButton, params); } else this.mCanClose = false; this.mInterstitialView .setOnClickListener(this.mInterstitialClickListener); this.mRootLayout.addView(layout); switch (this.mInterstitialData.interstitialType) { case InterstitialData.INTERSTITIAL_MARKUP: this.mInterstitialView .setMarkup(this.mInterstitialData.interstitialMarkup); break; case InterstitialData.INTERSTITIAL_URL: this.mInterstitialView .loadUrl(this.mInterstitialData.interstitialUrl); break; } } private void initRootLayout() { this.mRootLayout = new FrameLayout(this); this.mRootLayout.setBackgroundColor(Color.BLACK); } private void initVideoView() { this.mVideoData = this.mAd.getVideo(); this.setRequestedOrientation(this.mVideoData.orientation); if (this.mVideoData.orientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) { if (this.mWindowWidth < this.mWindowHeight) { final int size = this.mWindowWidth; this.mWindowWidth = this.mWindowHeight; this.mWindowHeight = size; } } else if (this.mWindowHeight < this.mWindowWidth) { final int size = this.mWindowHeight; this.mWindowHeight = this.mWindowWidth; this.mWindowWidth = size; } this.mVideoWidth = this.mVideoData.width; this.mVideoHeight = this.mVideoData.height; if (this.mVideoWidth <= 0) { this.mVideoWidth = this.mWindowWidth; this.mVideoHeight = this.mWindowHeight; } else { final DisplayMetrics m = this.getResources().getDisplayMetrics(); this.mVideoWidth = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, this.mVideoWidth, m); this.mVideoHeight = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, this.mVideoHeight, m); if (this.mVideoWidth > this.mWindowWidth) this.mVideoWidth = this.mWindowWidth; if (this.mVideoHeight > this.mWindowHeight) this.mVideoHeight = this.mWindowHeight; } this.mVideoLayout = new FrameLayout(this); this.mVideoView = new SDKVideoView(this, this.mVideoWidth, this.mVideoHeight, this.mVideoData.display); this.mVideoLayout.addView(this.mVideoView, new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, Gravity.CENTER)); if (this.mVideoData.showHtmlOverlay) { this.mOverlayView = new WebFrame(this, false, false, false); this.mOverlayView.setEnableZoom(false); this.mOverlayView.setOnClickListener(this.mOverlayClickListener); this.mOverlayView.setBackgroundColor(Color.TRANSPARENT); if (this.mVideoData.showHtmlOverlayAfter > 0) { this.mOverlayView.setVisibility(View.GONE); this.mVideoView.setOnTimeEventListener( this.mVideoData.showHtmlOverlayAfter, this.mOverlayShowListener); } if (this.mVideoData.htmlOverlayType == VideoData.OVERLAY_URL) this.mOverlayView.loadUrl(this.mVideoData.htmlOverlayUrl); else this.mOverlayView.setMarkup(this.mVideoData.htmlOverlayMarkup); final FrameLayout.LayoutParams overlayParams = new FrameLayout.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); if (this.mVideoData.showBottomNavigationBar && this.mVideoData.showTopNavigationBar) { overlayParams.bottomMargin = (int) (this.mWindowWidth * 0.11875); overlayParams.topMargin = (int) (this.mWindowWidth * 0.11875); overlayParams.gravity = Gravity.CENTER; } else if (this.mVideoData.showBottomNavigationBar && !this.mVideoData.showTopNavigationBar) { overlayParams.bottomMargin = (int) (this.mWindowWidth * 0.11875); overlayParams.gravity = Gravity.TOP; } else if (this.mVideoData.showTopNavigationBar && !this.mVideoData.showBottomNavigationBar) { overlayParams.topMargin = (int) (this.mWindowWidth * 0.11875); overlayParams.gravity = Gravity.BOTTOM; } this.mVideoLayout.addView(this.mOverlayView, overlayParams); } this.mMediaController = new MediaController(this, this.mVideoData); this.mVideoView.setMediaController(this.mMediaController); if (this.mVideoData.showNavigationBars) mMediaController.toggle(); if (!this.mVideoData.pauseEvents.isEmpty()) this.mMediaController .setOnPauseListener(this.mOnVideoPauseListener); if (!this.mVideoData.unpauseEvents.isEmpty()) this.mMediaController .setOnUnpauseListener(this.mOnVideoUnpauseListener); if (!this.mVideoData.replayEvents.isEmpty()) this.mMediaController .setOnReplayListener(this.mOnVideoReplayListener); this.mVideoLayout.addView(this.mMediaController, new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, Gravity.FILL_HORIZONTAL)); if (this.mVideoData.showSkipButton) { this.mSkipButton = new ImageView(this); this.mSkipButton.setAdjustViewBounds(false); FrameLayout.LayoutParams params = null; int buttonSize = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, this.skipButtonSizeLand, this .getResources().getDisplayMetrics()); int size = Math.min(this.getResources().getDisplayMetrics().widthPixels,this.getResources().getDisplayMetrics().heightPixels); buttonSize = (int)(size*0.09); params = new FrameLayout.LayoutParams(buttonSize, buttonSize, Gravity.TOP | Gravity.RIGHT); if (this.mVideoData.orientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) { final int margin = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, 8, this.getResources() .getDisplayMetrics()); params.topMargin = margin; params.rightMargin = margin; } else { final int margin = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, 10, this.getResources() .getDisplayMetrics()); params.topMargin = margin; params.rightMargin = margin; } if (this.mVideoData.skipButtonImage != null && this.mVideoData.skipButtonImage.length() > 0) this.mResourceManager.fetchResource(this, this.mVideoData.skipButtonImage, ResourceManager.DEFAULT_SKIP_IMAGE_RESOURCE_ID); else this.mSkipButton .setImageDrawable(mResourceManager .getResource(this,ResourceManager.DEFAULT_SKIP_IMAGE_RESOURCE_ID)); this.mSkipButton.setOnClickListener(this.mOnVideoSkipListener); if (this.mVideoData.showSkipButtonAfter > 0) { this.mCanClose = false; this.mSkipButton.setVisibility(View.GONE); } else { this.mCanClose = true; this.mSkipButton.setVisibility(View.VISIBLE); } this.mVideoLayout.addView(this.mSkipButton, params); } else this.mCanClose = false; if (this.mVideoData.showSkipButtonAfter > 0) this.mVideoView.setOnTimeEventListener( this.mVideoData.showSkipButtonAfter, this.mOnVideoCanCloseEventListener); final FrameLayout.LayoutParams params = new FrameLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, Gravity.CENTER); this.mLoadingView = new FrameLayout(this); final TextView loadingText = new TextView(this); loadingText.setText(Const.LOADING); this.mLoadingView.addView(loadingText, params); this.mVideoLayout.addView(this.mLoadingView, new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, Gravity.CENTER)); this.mVideoView.setOnPreparedListener(this.mOnVideoPreparedListener); this.mVideoView .setOnCompletionListener(this.mOnVideoCompletionListener); this.mVideoView.setOnErrorListener(this.mOnVideoErrorListener); this.mVideoView.setOnInfoListener(this.mOnVideoInfoListener); if (!this.mVideoData.startEvents.isEmpty()) this.mVideoView.setOnStartListener(this.mOnVideoStartListener); if (!this.mVideoData.timeTrackingEvents.isEmpty()) { final Set<Integer> keys = this.mVideoData.timeTrackingEvents .keySet(); for (final Iterator<Integer> it = keys.iterator(); it.hasNext();) { final int key = it.next(); this.mVideoView.setOnTimeEventListener(key, this.mOnVideoTimeEventListener); } } this.mVideoLastPosition = 0; String path = this.mVideoData.videoUrl; this.mVideoView.setVideoPath(path); } private void initWebBrowserView(final boolean showExit) { this.mWebBrowserView = new WebFrame(this, true, true, showExit); this.mWebBrowserView .setOnPageLoadedListener(this.mOnWebBrowserLoadedListener); this.mRootLayout.addView(this.mWebBrowserView); } public void navigate(final String clickUrl) { switch (this.mType) { case TYPE_BROWSER: this.mWebBrowserView.loadUrl(clickUrl); break; case TYPE_INTERSTITIAL: this.mInterstitialView.loadUrl(clickUrl); break; default: final Intent intent = new Intent(this, RichMediaActivity.class); intent.setData(Uri.parse(clickUrl)); this.startActivity(intent); } } @Override public void onConfigurationChanged(final Configuration newConfig) { super.onConfigurationChanged(newConfig); } @Override public void onCreate(final Bundle icicle) { super.onCreate(icicle); this.mResult = false; this.mPageLoaded = false; this.setResult(Activity.RESULT_CANCELED); final Window win = this.getWindow(); win.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); this.requestWindowFeature(Window.FEATURE_NO_TITLE); win.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); final Display display = this.getWindowManager().getDefaultDisplay(); this.metrics = new DisplayMetrics(); final WindowManager wm = (WindowManager) this .getSystemService(Context.WINDOW_SERVICE); wm.getDefaultDisplay().getMetrics(this.metrics); this.mWindowWidth = display.getWidth(); this.mWindowHeight = display.getHeight(); win.clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); this.setVolumeControlStream(AudioManager.STREAM_MUSIC); this.mType = RichMediaActivity.TYPE_UNKNOWN; final Intent intent = this.getIntent(); final Bundle extras = intent.getExtras(); if (extras == null || extras.getSerializable(Const.AD_EXTRA) == null) { this.uri = intent.getData(); if (this.uri == null) { this.finish(); return; } this.mType = RichMediaActivity.TYPE_BROWSER; } else this.requestWindowFeature(Window.FEATURE_NO_TITLE); mHandler = new ResourceHandler(this); this.mResourceManager = new ResourceManager(this, this.mHandler); this.initRootLayout(); if (this.mType == RichMediaActivity.TYPE_BROWSER) { this.initWebBrowserView(true); this.mWebBrowserView.loadUrl(this.uri.toString()); this.mEnterAnim = Util .getEnterAnimation(RichMediaAd.ANIMATION_FADE_IN); this.mExitAnim = Util .getExitAnimation(RichMediaAd.ANIMATION_FADE_IN); } else { this.mAd = (RichMediaAd) extras .getSerializable(Const.AD_EXTRA); this.mEnterAnim = Util.getEnterAnimation(this.mAd.getAnimation()); this.mExitAnim = Util.getExitAnimation(this.mAd.getAnimation()); this.mCanClose = false; this.mType = extras.getInt(Const.AD_TYPE_EXTRA, -1); if (this.mType == -1) switch (this.mAd.getType()) { case Const.VIDEO: case Const.VIDEO_TO_INTERSTITIAL: this.mType = RichMediaActivity.TYPE_VIDEO; break; case Const.INTERSTITIAL: case Const.INTERSTITIAL_TO_VIDEO: this.mType = RichMediaActivity.TYPE_INTERSTITIAL; break; } switch (this.mType) { case TYPE_VIDEO: this.initVideoView(); break; case TYPE_INTERSTITIAL: this.initInterstitialView(); break; } } this.setContentView(this.mRootLayout); } @Override protected void onDestroy() { mMediaController = null; mResourceManager.releaseInstance(); if(this.mVideoView!=null) this.mVideoView.destroy(); super.onDestroy(); } public void onHideCustomView() { if (this.mCustomView != null) { this.mCustomView.setVisibility(View.GONE); this.mCustomView = null; if (this.mCustomVideoView != null) { try { this.mCustomVideoView.stopPlayback(); } catch (final Exception e) { } this.mCustomVideoView = null; } } this.mCustomViewCallback.onCustomViewHidden(); this.mRootLayout.setVisibility(View.VISIBLE); this.setContentView(this.mRootLayout); } @Override public boolean onKeyDown(final int keyCode, final KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { this.goBack(); return true; } return super.onKeyDown(keyCode, event); } @Override protected void onPause() { super.onPause(); switch (this.mType) { case TYPE_VIDEO: this.mVideoLastPosition = this.mVideoView.getCurrentPosition(); this.mVideoView.stopPlayback(); this.mRootLayout.removeView(this.mVideoLayout); if (this.mVideoTimeoutTimer != null) { this.mVideoTimeoutTimer.cancel(); this.mVideoTimeoutTimer = null; } break; case TYPE_INTERSTITIAL: if (this.mInterstitialLoadingTimer != null) { this.mInterstitialLoadingTimer.cancel(); this.mInterstitialLoadingTimer = null; } if (this.mInterstitialAutocloseTimer != null) { this.mInterstitialAutocloseTimer.cancel(); this.mInterstitialAutocloseTimer = null; } if (this.mInterstitialCanCloseTimer != null) { this.mInterstitialCanCloseTimer.cancel(); this.mInterstitialCanCloseTimer = null; } break; } } @Override protected void onResume() { super.onResume(); switch (this.mType) { case TYPE_VIDEO: this.mRootLayout.addView(this.mVideoLayout); this.mVideoView.seekTo(this.mVideoLastPosition); this.mVideoView.start(); if (this.mVideoTimeoutTimer == null) { final VideoTimeoutTask autocloseTask = new VideoTimeoutTask( RichMediaActivity.this); this.mVideoTimeoutTimer = new Timer(); this.mVideoTimeoutTimer.schedule(autocloseTask, Const.VIDEO_LOAD_TIMEOUT); } break; case TYPE_INTERSTITIAL: switch (this.mInterstitialData.interstitialType) { case InterstitialData.INTERSTITIAL_MARKUP: if (!this.mPageLoaded) this.mInterstitialView .setMarkup(this.mInterstitialData.interstitialMarkup); break; case InterstitialData.INTERSTITIAL_URL: if (!this.mPageLoaded) this.mInterstitialView .loadUrl(this.mInterstitialData.interstitialUrl); break; } break; case TYPE_BROWSER: break; } } public void onShowCustomView(final View view, final CustomViewCallback callback) { if (view instanceof FrameLayout) { this.mCustomView = (FrameLayout) view; this.mCustomViewCallback = callback; if (this.mCustomView.getFocusedChild() instanceof VideoView) { this.mCustomVideoView = (VideoView) this.mCustomView .getFocusedChild(); this.mCustomVideoView .setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(final MediaPlayer mp) { RichMediaActivity.this.onHideCustomView(); } }); this.mCustomVideoView.start(); } this.mRootLayout.setVisibility(View.GONE); this.mCustomView.setVisibility(View.VISIBLE); this.setContentView(this.mCustomView); } } public void playVideo() { switch (this.mType) { case TYPE_VIDEO: if (this.mMediaController != null) this.mMediaController.replay(); break; case TYPE_INTERSTITIAL: if (this.mAd.getType() == Const.INTERSTITIAL_TO_VIDEO) { final Intent intent = new Intent(this, RichMediaActivity.class); intent.putExtra(Const.AD_EXTRA, this.mAd); intent.putExtra(Const.AD_TYPE_EXTRA, RichMediaActivity.TYPE_VIDEO); try { this.startActivity(intent); RichMediaActivity.setActivityAnimation(this, this.mEnterAnim, this.mExitAnim); this.mResult = true; this.setResult(Activity.RESULT_OK); } catch (final Exception e) { } } break; } } public void replayVideo() { if (this.mMediaController != null) this.mMediaController.replay(); } }