package com.adsdk.sdk.video;
import static com.adsdk.sdk.Const.ENCODING;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashSet;
import java.util.Set;
import org.apache.http.HttpStatus;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.os.AsyncTask;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.FrameLayout;
import android.widget.ImageView;
import com.adsdk.sdk.video.InterstitialController.BrowserControl;
import com.adsdk.sdk.video.WebViewClient.OnPageLoadedListener;
public class WebFrame extends FrameLayout implements BrowserControl {
private WebView mWebView;
private WebViewClient mWebViewClient;
private Activity mActivity;
private InterstitialController mController;
private ImageView mExitButton;
private boolean enableZoom=true;
private static Method mWebView_SetLayerType;
private static Field mWebView_LAYER_TYPE_SOFTWARE;
static {
initCompatibility();
};
private static void initCompatibility() {
try {
for(Method m:WebView.class.getMethods()){
if(m.getName().equals("setLayerType")){
mWebView_SetLayerType = m;
break;
}
}
mWebView_LAYER_TYPE_SOFTWARE = WebView.class.getField("LAYER_TYPE_SOFTWARE");
} catch (SecurityException e) {
} catch (NoSuchFieldException e) {
}
}
private static void setLayer(WebView webView){
if (mWebView_SetLayerType != null && mWebView_LAYER_TYPE_SOFTWARE !=null) {
try {
mWebView_SetLayerType.invoke(webView, mWebView_LAYER_TYPE_SOFTWARE.getInt(WebView.class), null);
} catch (InvocationTargetException ite) {
} catch (IllegalArgumentException e) {
} catch (IllegalAccessException e) {
}
}
}
public WebFrame(Activity context, boolean allowNavigation,
boolean scroll, boolean showExit) {
super(context);
initCompatibility();
mActivity = context;
mWebView = new WebView(context);
mWebView.setVerticalScrollBarEnabled(scroll);
mWebView.setHorizontalScrollBarEnabled(scroll);
mWebView.setBackgroundColor(Color.TRANSPARENT);
setLayer(mWebView);
WebSettings webSettings = mWebView.getSettings();
webSettings.setSavePassword(false);
webSettings.setSaveFormData(false);
webSettings.setJavaScriptEnabled(true);
webSettings.setPluginsEnabled(true);
webSettings.setSupportZoom(enableZoom);
webSettings.setBuiltInZoomControls(enableZoom);
mWebViewClient = new WebViewClient(mActivity, allowNavigation);
mWebView.setWebViewClient(mWebViewClient);
final Activity localContext = context;
if(showExit){
ImageView bg = new ImageView(context);
bg.setBackgroundColor(Color.TRANSPARENT);
addView(bg, new FrameLayout.LayoutParams(
android.view.ViewGroup.LayoutParams.FILL_PARENT,
android.view.ViewGroup.LayoutParams.FILL_PARENT, Gravity.CENTER));
addView(mWebView, new FrameLayout.LayoutParams(
android.view.ViewGroup.LayoutParams.FILL_PARENT,
android.view.ViewGroup.LayoutParams.FILL_PARENT, Gravity.CENTER));
mExitButton = new ImageView(context);
mExitButton.setAdjustViewBounds(false);
mExitButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
localContext.finish();
}
});
int buttonSize = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 35, getResources()
.getDisplayMetrics());
mExitButton.setImageDrawable(ResourceManager
.getStaticResource(context, ResourceManager.DEFAULT_SKIP_IMAGE_RESOURCE_ID));
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
buttonSize,
buttonSize, Gravity.TOP
| Gravity.RIGHT);
int margin = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 6, getResources()
.getDisplayMetrics());
params.topMargin = margin;
params.rightMargin = margin;
addView(mExitButton, params);
}
else{
addView(mWebView, new FrameLayout.LayoutParams(
android.view.ViewGroup.LayoutParams.FILL_PARENT,
android.view.ViewGroup.LayoutParams.FILL_PARENT, Gravity.CENTER));
}
}
public void loadUrl(String url) {
new LoadUrlTask().execute(url);
}
public void setMarkup(String htmlMarkup) {
String data = Uri.encode(htmlMarkup);
this.mWebViewClient.setAllowedUrl(null);
this.mWebView.loadData(data, "text/html", ENCODING);
}
@Override
public void setBackgroundColor(int color) {
super.setBackgroundColor(color);
this.mWebView.setBackgroundColor(color);
}
private class LoadUrlTask extends AsyncTask<String, Void, String> {
String userAgent;
public LoadUrlTask(){
userAgent = getUserAgentString();
}
@Override
protected String doInBackground(String... urls) {
String loadingUrl = urls[0];
URL url = null;
try {
url = new URL(loadingUrl);
} catch (MalformedURLException e) {
return (loadingUrl != null) ? loadingUrl : "";
}
int statusCode = -1;
HttpURLConnection connection = null;
String nextLocation = url.toString();
Set<String> redirectLocations = new HashSet<String>();
redirectLocations.add(nextLocation);
try {
do {
connection = (HttpURLConnection) url.openConnection();
connection.setRequestProperty("User-Agent",
userAgent);
connection.setInstanceFollowRedirects(false);
statusCode = connection.getResponseCode();
if (statusCode == HttpStatus.SC_OK) {
connection.disconnect();
break;
} else {
nextLocation = connection.getHeaderField("location");
connection.disconnect();
if (!redirectLocations.add(nextLocation)) {
return "";
}
url = new URL(nextLocation);
}
} while (statusCode == HttpStatus.SC_MOVED_TEMPORARILY
|| statusCode == HttpStatus.SC_MOVED_PERMANENTLY
|| statusCode == HttpStatus.SC_TEMPORARY_REDIRECT
|| statusCode == HttpStatus.SC_SEE_OTHER);
} catch (IOException e) {
return (nextLocation != null) ? nextLocation : "";
} finally {
if (connection != null)
connection.disconnect();
}
return nextLocation;
}
@Override
protected void onPostExecute(String url) {
if (url == null || url.equals("")) {
url = "about:blank";
}
mWebViewClient.setAllowedUrl(url);
mWebView.loadUrl(url);
requestLayout();
}
}
private String getUserAgentString() {
return mWebView.getSettings().getUserAgentString();
}
public WebView getWebView() {
return mWebView;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
this.onTouchEvent(ev);
return false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
return true;
}
@Override
public boolean canGoBack() {
return mWebView.canGoBack();
}
@Override
public void goBack() {
mWebView.goBack();
}
@Override
public boolean canGoForward() {
return mWebView.canGoForward();
}
@Override
public void goForward() {
mWebView.goForward();
}
@Override
public void reload() {
mWebView.reload();
}
public void setBrowserController(InterstitialController controller) {
if (mController != null) {
mController.hide();
}
mController = controller;
attachController();
}
private void attachController() {
if (mController != null) {
mController.setBrowser(this);
}
}
@Override
public int getTime() {
int time = 0;
long finishedLoadedTime = mWebViewClient.getFinishedLoadingTime();
if (finishedLoadedTime > 0) {
return (int) (System.currentTimeMillis() - finishedLoadedTime);
}
return time;
}
@Override
public void launchExternalBrowser() {
String url = mWebViewClient.getAllowedUrl();
if ((url == null) || (url.length() == 0)) {
url = "about:blank";
}
Intent intent = new Intent("android.intent.action.VIEW", Uri.parse(url));
mActivity.startActivity(intent);
}
@Override
public String getPageTitle() {
return mWebView.getTitle();
}
public void setOnPageLoadedListener(OnPageLoadedListener l) {
this.mWebViewClient.setOnPageLoadedListener(l);
}
public boolean isEnableZoom() {
return enableZoom;
}
public void setEnableZoom(boolean enableZoom) {
this.enableZoom = enableZoom;
WebSettings webSettings = mWebView.getSettings();
webSettings.setSupportZoom(enableZoom);
webSettings.setBuiltInZoomControls(enableZoom);
}
}