package com.adsdk.sdk.video;
import java.lang.ref.WeakReference;
import java.util.Formatter;
import java.util.Locale;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
public class InterstitialController extends LinearLayout {
private static final int DEFAULT_TIMEOUT = 3000;
private static final int FADE_OUT = 1;
private static final int SHOW_PROGRESS = 2;
private BrowserControl mBrowser;
private InterstitialData mInterstitialData;
private Context mContext;
private ResourceManager mResourceManager;
private FrameLayout mBrowserView;
private LinearLayout mTopBar;
private LinearLayout mBottomBar;
private AspectRatioImageView mBottomBarBackground;
private AspectRatioImageView mTopBarBackground;
private LinearLayout mNavIconsLayout;
private AspectRatioImageViewWidth mBackButton;
private AspectRatioImageViewWidth mForwardButton;
private AspectRatioImageViewWidth mReloadButton;
private AspectRatioImageViewWidth mExternalButton;
private TextView mLeftTime;
private TextView mTitleText;
StringBuilder mFormatBuilder;
Formatter mFormatter;
private boolean mShowing;
private boolean mFixed;
private boolean mAutoclose;
private int mDefaultTimeout;
private String mTitle;
private OnReloadListener mOnReloadListener;
private OnResetAutocloseListener mOnResetAutocloseListener;
private double buttonWidthPercent = 0.09;
private Handler mHandler;
public InterstitialController(Context context,
InterstitialData interstitialData) {
super(context);
DisplayMetrics metrics = new DisplayMetrics();
WindowManager wm = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
wm.getDefaultDisplay().getMetrics(metrics);
mContext = context;
mInterstitialData = interstitialData;
if (mInterstitialData == null) {
throw new IllegalArgumentException(
"Interstitial info cannot be null");
}
mFormatBuilder = new StringBuilder();
mFormatter = new Formatter(mFormatBuilder, Locale.getDefault());
mFixed = false;
mAutoclose = (mInterstitialData.autoclose > 0);
mDefaultTimeout = DEFAULT_TIMEOUT;
if ((mInterstitialData != null)
&& (!mInterstitialData.allowTapNavigationBars)) {
mDefaultTimeout = 0;
}
mHandler = new ResourceHandler(this);
mResourceManager = new ResourceManager(mContext, mHandler);
buildNavigationBarView(metrics);
}
public void setBrowserView(View browserView) {
mBrowserView.addView(browserView, new FrameLayout.LayoutParams(
android.view.ViewGroup.LayoutParams.FILL_PARENT,
android.view.ViewGroup.LayoutParams.FILL_PARENT, Gravity.CENTER));
}
public void setBrowser(BrowserControl browser) {
mBrowser = browser;
updateBackForward();
}
private void buildNavigationBarView(DisplayMetrics metrics) {
this.setWeightSum(1);
this.setOrientation(LinearLayout.VERTICAL);
this.setLayoutParams(new LinearLayout.LayoutParams(
android.view.ViewGroup.LayoutParams.FILL_PARENT,
android.view.ViewGroup.LayoutParams.FILL_PARENT));
mTopBar = new LinearLayout(mContext);
mTopBar.setOrientation(LinearLayout.HORIZONTAL);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
android.view.ViewGroup.LayoutParams.FILL_PARENT,
android.view.ViewGroup.LayoutParams.WRAP_CONTENT);
params.gravity = Gravity.TOP;
params.weight = 0;
mTopBar.setLayoutParams(params);
mTopBar.setBackgroundColor(Color.TRANSPARENT);
mTopBar.setGravity(Gravity.CENTER);
int padding = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 4, getResources()
.getDisplayMetrics());
mTopBar.setPadding(padding, 0, padding, 0);
mTopBarBackground = new AspectRatioImageView(mContext);
mTopBarBackground.setLayoutParams(params);
mTopBarBackground
.fillParent(true, this.getWidth(), mTopBar.getHeight());
this.addView(mTopBarBackground, params);
this.addView(mTopBar, params);
mTitleText = new TextView(mContext);
params = new LinearLayout.LayoutParams(
android.view.ViewGroup.LayoutParams.WRAP_CONTENT,
android.view.ViewGroup.LayoutParams.WRAP_CONTENT, 1);
params.gravity = Gravity.CENTER;
mTitleText.setTextAppearance(mContext,
android.R.style.TextAppearance_Small);
mTitleText.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
mTitleText.setGravity(Gravity.CENTER);
mTopBar.addView(mTitleText, params);
mBrowserView = new FrameLayout(mContext);
LinearLayout.LayoutParams browserParams = new LinearLayout.LayoutParams(
android.view.ViewGroup.LayoutParams.FILL_PARENT,
android.view.ViewGroup.LayoutParams.WRAP_CONTENT);
browserParams.gravity = Gravity.TOP;
browserParams.weight = 1;
mBrowserView.setBackgroundColor(Color.WHITE);
this.addView(mBrowserView, browserParams);
mBottomBar = new LinearLayout(mContext);
mBottomBar.setOrientation(LinearLayout.HORIZONTAL);
params = new LinearLayout.LayoutParams(
android.view.ViewGroup.LayoutParams.FILL_PARENT,
(int)(metrics.widthPixels*0.119));
params.gravity = Gravity.BOTTOM;
params.weight = 0;
mBottomBar.setLayoutParams(params);
mBottomBar.setBackgroundColor(Color.TRANSPARENT);
mBottomBar.setGravity(Gravity.CENTER_VERTICAL);
mBottomBar.setWeightSum(1);
mBottomBarBackground = new AspectRatioImageView(mContext);
mBottomBarBackground
.fillParent(true, this.getWidth(), mBottomBar.getHeight());
this.addView(mBottomBarBackground);
this.addView(mBottomBar, params);
LinearLayout buttonPanel = new LinearLayout(mContext);
params = new LinearLayout.LayoutParams(
android.view.ViewGroup.LayoutParams.WRAP_CONTENT,
android.view.ViewGroup.LayoutParams.FILL_PARENT, 0);
params.gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL;
buttonPanel.setOrientation(LinearLayout.HORIZONTAL);
mBottomBar.addView(buttonPanel, params);
padding = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 4, getResources()
.getDisplayMetrics());
mReloadButton = new AspectRatioImageViewWidth(mContext);
params = new LinearLayout.LayoutParams(
(int) (metrics.widthPixels*buttonWidthPercent),
(int) (metrics.widthPixels*buttonWidthPercent));
params.leftMargin=4;
params.rightMargin=4;
params.gravity = Gravity.CENTER_VERTICAL;
mReloadButton.setAdjustViewBounds(true);
mReloadButton.setPadding(padding, 0, padding, 0);
buttonPanel.addView(mReloadButton, params);
mBackButton = new AspectRatioImageViewWidth(mContext);
mBackButton.setPadding(padding, 0, padding, 0);
buttonPanel.addView(mBackButton, params);
mForwardButton = new AspectRatioImageViewWidth(mContext);
mForwardButton.setPadding(padding, 0, padding, 0);
buttonPanel.addView(mForwardButton, params);
mExternalButton = new AspectRatioImageViewWidth(mContext);
mExternalButton.setPadding(padding, 0, padding, 0);
buttonPanel.addView(mExternalButton, params);
mLeftTime = new AutoResizeTextView(mContext);
params = new LinearLayout.LayoutParams(
android.view.ViewGroup.LayoutParams.WRAP_CONTENT,
android.view.ViewGroup.LayoutParams.WRAP_CONTENT);
params.gravity = Gravity.CENTER;
mLeftTime.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
buttonPanel.addView(mLeftTime, params);
mNavIconsLayout = new LinearLayout(mContext);
params = new LinearLayout.LayoutParams(
android.view.ViewGroup.LayoutParams.WRAP_CONTENT,
android.view.ViewGroup.LayoutParams.WRAP_CONTENT, 1);
params.gravity = Gravity.RIGHT | Gravity.CENTER_VERTICAL;
mNavIconsLayout.setOrientation(LinearLayout.HORIZONTAL);
mNavIconsLayout.setPadding(0, 0, 0, 0);
mNavIconsLayout.setGravity(Gravity.CENTER_VERTICAL | Gravity.RIGHT);
mBottomBar.addView(mNavIconsLayout, params);
initNavigationBarControllerView(padding,metrics);
}
private void initNavigationBarControllerView(int padding, DisplayMetrics metrics) {
if (!mInterstitialData.showBottomNavigationBar) {
mBottomBar.setVisibility(View.GONE);
} else {
mBottomBar.setVisibility(View.VISIBLE);
if ((mInterstitialData.bottomNavigationBarBackground != null)
&& (mInterstitialData.bottomNavigationBarBackground
.length() > 0)) {
mResourceManager.fetchResource(mContext,
mInterstitialData.bottomNavigationBarBackground,
ResourceManager.DEFAULT_BOTTOMBAR_BG_RESOURCE_ID);
} else {
mBottomBar
.setBackgroundDrawable(mResourceManager
.getResource(mContext,ResourceManager.DEFAULT_BOTTOMBAR_BG_RESOURCE_ID));
}
if (mBackButton != null) {
if ((mInterstitialData.backButtonImage != null)
&& (mInterstitialData.backButtonImage.length() > 0)) {
mBackButton.setBackgroundDrawable(null);
mResourceManager.fetchResource(mContext,
mInterstitialData.backButtonImage,
ResourceManager.DEFAULT_BACK_IMAGE_RESOURCE_ID);
} else {
mBackButton.setImageDrawable(mResourceManager
.getResource(mContext,ResourceManager.DEFAULT_BACK_IMAGE_RESOURCE_ID));
mBackButton.setEnabled(false);
}
mBackButton.setOnClickListener(mBackListener);
if (mInterstitialData.showBackButton) {
mBackButton.setVisibility(View.VISIBLE);
} else {
mBackButton.setVisibility(View.GONE);
}
}
if (mForwardButton != null) {
if ((mInterstitialData.forwardButtonImage != null)
&& (mInterstitialData.forwardButtonImage.length() > 0)) {
mForwardButton.setBackgroundDrawable(null);
mResourceManager.fetchResource(mContext,
mInterstitialData.forwardButtonImage,
ResourceManager.DEFAULT_FORWARD_IMAGE_RESOURCE_ID);
} else {
mForwardButton.setImageDrawable(mResourceManager
.getResource(mContext,ResourceManager.DEFAULT_FORWARD_IMAGE_RESOURCE_ID));
}
mForwardButton.setOnClickListener(mForwardListener);
if (mInterstitialData.showForwardButton) {
mForwardButton.setVisibility(View.VISIBLE);
} else {
mForwardButton.setVisibility(View.GONE);
}
}
if (mReloadButton != null) {
if ((mInterstitialData.reloadButtonImage != null)
&& (mInterstitialData.reloadButtonImage.length() > 0)) {
mReloadButton.setBackgroundDrawable(null);
mResourceManager.fetchResource(mContext,
mInterstitialData.reloadButtonImage,
ResourceManager.DEFAULT_RELOAD_IMAGE_RESOURCE_ID);
} else {
mReloadButton.setImageDrawable(mResourceManager
.getResource(mContext,ResourceManager.DEFAULT_RELOAD_IMAGE_RESOURCE_ID));
}
mReloadButton.setOnClickListener(mReloadListener);
if (mInterstitialData.showReloadButton) {
mReloadButton.setVisibility(View.VISIBLE);
} else {
mReloadButton.setVisibility(View.GONE);
}
}
if (mExternalButton != null) {
if ((mInterstitialData.externalButtonImage != null)
&& (mInterstitialData.externalButtonImage.length() > 0)) {
mExternalButton.setBackgroundDrawable(null);
mResourceManager.fetchResource(mContext,
mInterstitialData.externalButtonImage,
ResourceManager.DEFAULT_EXTERNAL_IMAGE_RESOURCE_ID);
} else {
mExternalButton.setImageDrawable(mResourceManager
.getResource(mContext,ResourceManager.DEFAULT_EXTERNAL_IMAGE_RESOURCE_ID));
}
mExternalButton.setOnClickListener(mExternalListener);
if (mInterstitialData.showExternalButton) {
mExternalButton.setVisibility(View.VISIBLE);
} else {
mExternalButton.setVisibility(View.GONE);
}
}
mFormatBuilder = new StringBuilder();
mFormatter = new Formatter(mFormatBuilder, Locale.getDefault());
if (mLeftTime != null) {
if ((mInterstitialData.showTimer) && (mAutoclose)) {
mLeftTime.setVisibility(View.VISIBLE);
} else {
mLeftTime.setVisibility(View.GONE);
}
}
if (!mInterstitialData.icons.isEmpty()) {
for (int i = 0; i < mInterstitialData.icons.size(); i++) {
NavIconData iconData = mInterstitialData.icons.get(i);
NavIcon icon = new NavIcon(mContext, iconData);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
(int) (metrics.widthPixels*buttonWidthPercent),
(int) (metrics.widthPixels*buttonWidthPercent));
mNavIconsLayout.addView(icon, params);
}
}
}
if (!mInterstitialData.showTopNavigationBar) {
mTopBar.setVisibility(View.GONE);
} else {
mTopBar.setVisibility(View.VISIBLE);
if ((mInterstitialData.topNavigationBarBackground != null)
&& (mInterstitialData.topNavigationBarBackground.length() > 0)) {
mResourceManager.fetchResource(mContext,
mInterstitialData.topNavigationBarBackground,
ResourceManager.DEFAULT_TOPBAR_BG_RESOURCE_ID);
} else {
mTopBarBackground.setImageDrawable(mResourceManager
.getResource(mContext,ResourceManager.DEFAULT_TOPBAR_BG_RESOURCE_ID));
}
if (mTitleText != null) {
if (mInterstitialData.topNavigationBarTitleType == InterstitialData.INTERSTITIAL_TITLE_FIXED) {
mTitleText.setText(mInterstitialData.topNavigationBarTitle);
}
else if(mInterstitialData.topNavigationBarTitleType == InterstitialData.INTERSTITIAL_TITLE_HIDDEN) {
mTitleText.setVisibility(View.GONE);
}
}
}
if (!mInterstitialData.showNavigationBars) {
if (mTopBar != null) {
mTopBar.setVisibility(View.GONE);
}
if (mBottomBar != null) {
mBottomBar.setVisibility(View.GONE);
}
}
}
public void resetAutoclose() {
if (mAutoclose) {
mAutoclose = false;
if (mOnResetAutocloseListener != null) {
mOnResetAutocloseListener.onResetAutoclose();
}
}
}
public void show() {
show(mDefaultTimeout);
}
public void show(int timeout) {
if (timeout == 0) {
mFixed = true;
}
if (!mShowing) {
setProgress();
if ((mTopBar != null) && (mInterstitialData.showTopNavigationBar)) {
mTopBar.setVisibility(View.VISIBLE);
}
if ((mBottomBar != null)
&& (mInterstitialData.showBottomNavigationBar)) {
mBottomBar.setVisibility(View.VISIBLE);
}
mShowing = true;
}
updateBackForward();
mHandler.removeMessages(FADE_OUT);
mHandler.sendEmptyMessage(SHOW_PROGRESS);
if ((timeout != 0) && (!mFixed)) {
Message msg = mHandler.obtainMessage(FADE_OUT);
mHandler.sendMessageDelayed(msg, timeout);
}
}
public boolean isShowing() {
return mShowing;
}
public void hide() {
if (canToggle()) {
if (mShowing) {
mHandler.removeMessages(SHOW_PROGRESS);
if (mTopBar != null) {
mTopBar.setVisibility(View.GONE);
}
if (mBottomBar != null) {
mBottomBar.setVisibility(View.GONE);
}
mShowing = false;
mFixed = false;
}
}
}
public void resizeTopBar(int bottom) {
if (bottom <= 0)
return;
int padding = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 4, getResources()
.getDisplayMetrics());
if (this.mTopBar != null) {
ViewGroup.LayoutParams params = this.mTopBar.getLayoutParams();
params.height = bottom + padding;
this.mTopBar.setLayoutParams(params);
}
}
public void toggle() {
if (canToggle()) {
if (mShowing) {
hide();
} else {
show();
}
}
}
public void reload() {
if (mBrowser != null) {
mBrowser.reload();
}
setProgress();
show(mDefaultTimeout);
if (mOnReloadListener != null) {
mOnReloadListener.onInterstitialReload();
}
}
public void pageLoaded() {
setProgress();
}
private static class ResourceHandler extends Handler{
WeakReference<InterstitialController> interstitialController;
public ResourceHandler(InterstitialController i) {
interstitialController = new WeakReference<InterstitialController>(i);
}
@Override
public void handleMessage(Message msg) {
InterstitialController wInterstitialController = interstitialController.get();
if(wInterstitialController!=null){
switch (msg.what) {
case SHOW_PROGRESS:
wInterstitialController.setProgress();
if (wInterstitialController.mShowing && wInterstitialController.mInterstitialData.showTimer) {
msg = obtainMessage(SHOW_PROGRESS);
sendMessageDelayed(msg, 1000);
}
break;
default:
wInterstitialController.handleMessage(msg);
}
}
}
}
private void handleMessage(Message msg) {
switch (msg.what) {
case FADE_OUT:
hide();
break;
case ResourceManager.RESOURCE_LOADED_MSG:
switch (msg.arg1) {
case ResourceManager.DEFAULT_TOPBAR_BG_RESOURCE_ID:
if (mTopBar != null) {
Drawable d = mResourceManager
.getResource(mContext,ResourceManager.DEFAULT_TOPBAR_BG_RESOURCE_ID);
if (d != null) {
mTopBarBackground.setImageDrawable(d);
}
}
break;
case ResourceManager.DEFAULT_BOTTOMBAR_BG_RESOURCE_ID:
if (mBottomBar != null) {
Drawable d = mResourceManager
.getResource(mContext,ResourceManager.DEFAULT_BOTTOMBAR_BG_RESOURCE_ID);
if (d != null) {
mBottomBar.setBackgroundDrawable(d);
}
}
break;
case ResourceManager.DEFAULT_BACK_IMAGE_RESOURCE_ID:
if (mBackButton != null) {
Drawable d = mResourceManager
.getResource(mContext,ResourceManager.DEFAULT_BACK_IMAGE_RESOURCE_ID);
if (d != null) {
mBackButton.setImageDrawable(d);
}
}
break;
case ResourceManager.DEFAULT_FORWARD_IMAGE_RESOURCE_ID:
if (mForwardButton != null) {
Drawable d = mResourceManager
.getResource(mContext,ResourceManager.DEFAULT_FORWARD_IMAGE_RESOURCE_ID);
if (d != null) {
mForwardButton.setImageDrawable(d);
}
}
break;
case ResourceManager.DEFAULT_RELOAD_IMAGE_RESOURCE_ID:
if (mReloadButton != null) {
Drawable d = mResourceManager
.getResource(mContext,ResourceManager.DEFAULT_RELOAD_IMAGE_RESOURCE_ID);
if (d != null) {
mReloadButton.setImageDrawable(d);
}
}
break;
case ResourceManager.DEFAULT_EXTERNAL_IMAGE_RESOURCE_ID:
if (mExternalButton != null) {
Drawable d = mResourceManager
.getResource(mContext,ResourceManager.DEFAULT_EXTERNAL_IMAGE_RESOURCE_ID);
if (d != null) {
mExternalButton.setImageDrawable(d);
}
}
break;
}
break;
}
}
private String stringForTime(int timeMs) {
int totalSeconds = timeMs / 1000;
int seconds = totalSeconds % 60;
int minutes = (totalSeconds / 60) % 60;
int hours = totalSeconds / 3600;
mFormatBuilder.setLength(0);
if (hours > 0) {
return mFormatter.format("%d:%02d:%02d", hours, minutes, seconds)
.toString();
} else if (minutes > 0) {
return mFormatter.format("%02d:%02d", minutes, seconds).toString();
} else {
return mFormatter.format("0:%02d", seconds).toString();
}
}
private int setProgress() {
int position = 0;
if (mBrowser != null) {
position = mBrowser.getTime();
}
int duration = mInterstitialData.autoclose * 1000;
int timeLeft = duration - position;
if ((mAutoclose) && (duration > 0) && (timeLeft >= 0)) {
if (mLeftTime != null) {
mLeftTime.setText(stringForTime(timeLeft));
}
} else {
if (mLeftTime != null) {
mLeftTime.setVisibility(View.GONE);
}
}
if (mTitleText != null) {
if (mInterstitialData.topNavigationBarTitleType == InterstitialData.INTERSTITIAL_TITLE_HTML) {
if (mBrowser != null) {
if ((mTitle == null)
|| (!mTitle.equals(mBrowser.getPageTitle()))) {
mTitle = mBrowser.getPageTitle();
mTitleText.setText(mTitle);
}
}
}
}
updateBackForward();
return position;
}
private View.OnClickListener mBackListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mBrowser != null) {
mBrowser.goBack();
}
show(mDefaultTimeout);
}
};
private View.OnClickListener mReloadListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
reload();
}
};
private View.OnClickListener mForwardListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mBrowser != null) {
mBrowser.goForward();
}
show(mDefaultTimeout);
}
};
private View.OnClickListener mExternalListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mBrowser != null) {
mBrowser.launchExternalBrowser();
}
}
};
private void updateBackForward() {
if (mBrowser == null)
return;
if (mBrowser.canGoBack()) {
if (mBackButton != null) {
mBackButton.setEnabled(true);
}
} else {
if (mBackButton != null) {
mBackButton.setEnabled(false);
}
}
if (mBrowser.canGoForward()) {
if (mForwardButton != null) {
mForwardButton.setEnabled(true);
}
} else {
if (mForwardButton != null) {
mForwardButton.setEnabled(false);
}
}
}
public boolean canToggle() {
return mInterstitialData.allowTapNavigationBars;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
this.onTouchEvent(ev);
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
this.resetAutoclose();
return true;
}
public void setOnReloadListener(OnReloadListener l) {
mOnReloadListener = l;
}
public void setOnResetAutocloseListener(OnResetAutocloseListener l) {
mOnResetAutocloseListener = l;
}
public interface OnReloadListener {
public void onInterstitialReload();
}
public interface OnResetAutocloseListener {
public void onResetAutoclose();
}
public interface BrowserControl {
int getTime();
boolean canGoBack();
boolean canGoForward();
void goBack();
void goForward();
void reload();
void launchExternalBrowser();
String getPageTitle();
}
}