package com.mopub.common; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; import android.view.Gravity; import android.view.View; import android.view.Window; import android.webkit.CookieSyncManager; import android.webkit.WebChromeClient; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.Toast; import com.mopub.common.logging.MoPubLog; import static android.view.ViewGroup.LayoutParams.MATCH_PARENT; import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT; import static com.mopub.common.util.Drawables.BACKGROUND; import static com.mopub.common.util.Drawables.CLOSE; import static com.mopub.common.util.Drawables.LEFT_ARROW; import static com.mopub.common.util.Drawables.REFRESH; import static com.mopub.common.util.Drawables.RIGHT_ARROW; import static com.mopub.common.util.Drawables.UNLEFT_ARROW; import static com.mopub.common.util.Drawables.UNRIGHT_ARROW; import static com.mopub.common.util.Intents.deviceCanHandleIntent; import static com.mopub.common.util.Intents.isDeepLink; public class MoPubBrowser extends Activity { public static final String DESTINATION_URL_KEY = "URL"; private static final int INNER_LAYOUT_ID = 1; private WebView mWebView; private ImageButton mBackButton; private ImageButton mForwardButton; private ImageButton mRefreshButton; private ImageButton mCloseButton; public static void open(final Context context, final String url) { MoPubLog.d("Opening url in MoPubBrowser: " + url); final Intent intent = new Intent(context, MoPubBrowser.class); intent.putExtra(DESTINATION_URL_KEY, url); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setResult(Activity.RESULT_OK); getWindow().requestFeature(Window.FEATURE_PROGRESS); getWindow().setFeatureInt(Window.FEATURE_PROGRESS, Window.PROGRESS_VISIBILITY_ON); setContentView(getMoPubBrowserView()); initializeWebView(); initializeButtons(); enableCookies(); } private void initializeWebView() { WebSettings webSettings = mWebView.getSettings(); webSettings.setJavaScriptEnabled(true); /** * Pinch to zoom is apparently not enabled by default on all devices, so * declare zoom support explicitly. * http://stackoverflow.com/questions/5125851/enable-disable-zoom-in-android-webview */ webSettings.setSupportZoom(true); webSettings.setBuiltInZoomControls(true); webSettings.setUseWideViewPort(true); mWebView.loadUrl(getIntent().getStringExtra(DESTINATION_URL_KEY)); mWebView.setWebViewClient(new WebViewClient() { @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { Toast.makeText(MoPubBrowser.this, "MoPubBrowser error: " + description, Toast.LENGTH_SHORT).show(); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url == null) { return false; } final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); if (isDeepLink(url) && deviceCanHandleIntent(MoPubBrowser.this, intent)) { startActivity(intent); finish(); return true; } else { return false; } } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); mForwardButton.setImageDrawable(UNRIGHT_ARROW.createDrawable(MoPubBrowser.this)); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); Drawable backImageDrawable = view.canGoBack() ? LEFT_ARROW.createDrawable(MoPubBrowser.this) : UNLEFT_ARROW.createDrawable(MoPubBrowser.this); mBackButton.setImageDrawable(backImageDrawable); Drawable forwardImageDrawable = view.canGoForward() ? RIGHT_ARROW.createDrawable(MoPubBrowser.this) : UNRIGHT_ARROW.createDrawable(MoPubBrowser.this); mForwardButton.setImageDrawable(forwardImageDrawable); } }); mWebView.setWebChromeClient(new WebChromeClient() { public void onProgressChanged(WebView webView, int progress) { setTitle("Loading..."); setProgress(progress * 100); if (progress == 100) { setTitle(webView.getUrl()); } } }); } private void initializeButtons() { mBackButton.setBackgroundColor(Color.TRANSPARENT); mBackButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { if (mWebView.canGoBack()) { mWebView.goBack(); } } }); mForwardButton.setBackgroundColor(Color.TRANSPARENT); mForwardButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { if (mWebView.canGoForward()) { mWebView.goForward(); } } }); mRefreshButton.setBackgroundColor(Color.TRANSPARENT); mRefreshButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { mWebView.reload(); } }); mCloseButton.setBackgroundColor(Color.TRANSPARENT); mCloseButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { MoPubBrowser.this.finish(); } }); } private void enableCookies() { CookieSyncManager.createInstance(this); CookieSyncManager.getInstance().startSync(); } @Override protected void onPause() { super.onPause(); CookieSyncManager.getInstance().stopSync(); } @Override protected void onResume() { super.onResume(); CookieSyncManager.getInstance().startSync(); } private View getMoPubBrowserView() { LinearLayout moPubBrowserView = new LinearLayout(this); LinearLayout.LayoutParams browserLayoutParams = new LinearLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT); moPubBrowserView.setLayoutParams(browserLayoutParams); moPubBrowserView.setOrientation(LinearLayout.VERTICAL); RelativeLayout outerLayout = new RelativeLayout(this); LinearLayout.LayoutParams outerLayoutParams = new LinearLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT); outerLayout.setLayoutParams(outerLayoutParams); moPubBrowserView.addView(outerLayout); LinearLayout innerLayout = new LinearLayout(this); innerLayout.setId(INNER_LAYOUT_ID); RelativeLayout.LayoutParams innerLayoutParams = new RelativeLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT); innerLayoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); innerLayout.setLayoutParams(innerLayoutParams); innerLayout.setBackgroundDrawable(BACKGROUND.createDrawable(this)); outerLayout.addView(innerLayout); mBackButton = getButton(LEFT_ARROW.createDrawable(this)); mForwardButton = getButton(RIGHT_ARROW.createDrawable(this)); mRefreshButton = getButton(REFRESH.createDrawable(this)); mCloseButton = getButton(CLOSE.createDrawable(this)); innerLayout.addView(mBackButton); innerLayout.addView(mForwardButton); innerLayout.addView(mRefreshButton); innerLayout.addView(mCloseButton); mWebView = new WebView(this); RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT); layoutParams.addRule(RelativeLayout.ABOVE, INNER_LAYOUT_ID); mWebView.setLayoutParams(layoutParams); outerLayout.addView(mWebView); return moPubBrowserView; } private ImageButton getButton(final Drawable drawable) { ImageButton imageButton = new ImageButton(this); LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT, 1f); layoutParams.gravity = Gravity.CENTER_VERTICAL; imageButton.setLayoutParams(layoutParams); imageButton.setImageDrawable(drawable); return imageButton; } }