package com.appboy.ui;
import android.annotation.TargetApi;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.webkit.DownloadListener;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.RelativeLayout;
import com.appboy.Constants;
import com.appboy.enums.Channel;
import com.appboy.support.AppboyFileUtils;
import com.appboy.support.AppboyLogger;
import com.appboy.ui.actions.ActionFactory;
import com.appboy.ui.actions.IAction;
import com.appboy.ui.activities.AppboyBaseActivity;
public class AppboyWebViewActivity extends AppboyBaseActivity {
private static final String TAG = String.format("%s.%s", Constants.APPBOY_LOG_TAG_PREFIX, AppboyWebViewActivity.class.getName());
// The Intent extra string containing the URL to open.
/**
* @Deprecated use {@link Constants#APPBOY_WEBVIEW_URL_EXTRA} instead.
*/
@Deprecated
public static final String URL_EXTRA = Constants.APPBOY_WEBVIEW_URL_EXTRA;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_PROGRESS);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setWindowFlagsSafe();
setContentView(R.layout.com_appboy_webview_activity);
setProgressBarVisibility(true);
WebView webView = (WebView) findViewById(R.id.com_appboy_webview_activity_webview);
WebSettings webSettings = webView.getSettings();
// JavaScript is enabled by default to support a larger number of web pages. If JavaScript support is not
// necessary, then it should be disabled.
webSettings.setJavaScriptEnabled(true);
webSettings.setAllowFileAccess(false);
// Plugin support is disabled by default. If plugins, such as flash, are required, change the PluginState.
webSettings.setPluginState(WebSettings.PluginState.OFF);
setZoomSafe(webSettings);
webSettings.setBuiltInZoomControls(true);
webSettings.setUseWideViewPort(true);
webSettings.setLoadWithOverviewMode(true);
webSettings.setDomStorageEnabled(true);
// Instruct webview to be as large as its parent view.
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
webView.setLayoutParams(layoutParams);
webView.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress) {
if (progress < 100) {
setProgressBarVisibility(true);
} else {
setProgressBarVisibility(false);
}
}
});
webView.setDownloadListener(new DownloadListener() {
public void onDownloadStart(String url, String userAgent,
String contentDisposition, String mimetype,
long contentLength) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
startActivity(intent);
}
});
webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
setWebLayerTypeSafe(webView);
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
try {
// If the Uri scheme is not supported by a web action (i.e. if it's not a web url),
// allow the system to try to open the uri first. This allows the system to handle,
// for example, redirects to the play store via a "store://" Uri.
if (!AppboyFileUtils.REMOTE_SCHEMES.contains(Uri.parse(url).getScheme())) {
IAction action = ActionFactory.createUriActionFromUrlString(url, getIntent().getExtras(), false, Channel.UNKNOWN);
// Instead of using AppboyNavigator, just open directly.
action.execute(view.getContext());
// Close the WebView if the action was executed successfully
finish();
return true;
}
} catch (Exception e) {
AppboyLogger.i(TAG, String.format("Unexpected exception while processing url %s. "
+ "Passing url back to WebView.", url), e);
}
return super.shouldOverrideUrlLoading(view, url);
}
});
Bundle extras = getIntent().getExtras();
// Opens the URL passed as an intent extra (if one exists).
if (extras != null && extras.containsKey(URL_EXTRA)) {
String url = extras.getString(URL_EXTRA);
webView.loadUrl(url);
}
}
/**
* Enables hardware acceleration for the window. See https://developer.android.com/guide/topics/graphics/hardware-accel.html#controlling . With this flag, we can view Youtube
* videos since HTML5 requires hardware acceleration.
*/
@TargetApi(11)
private void setWindowFlagsSafe() {
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
getWindow().setFlags(
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
}
}
@TargetApi(11)
private void setZoomSafe(WebSettings webSettings) {
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
webSettings.setDisplayZoomControls(false);
}
}
@TargetApi(11)
private void setWebLayerTypeSafe(WebView webView) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
// This enables hardware acceleration if the manifest also has it defined. If not defined, then the layer type will fallback to software
webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
}
}
}