package com.v7lin.android.env.webkit;
import android.annotation.SuppressLint;
import android.graphics.Color;
import android.os.Build;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebSettings.LayoutAlgorithm;
import android.webkit.WebSettings.RenderPriority;
import android.webkit.WebView;
import com.v7lin.android.env.webkit.WebSettingsCompat.PluginStateCompat;
/**
*
*
* @author v7lin Email:v7lin@qq.com
*/
@SuppressLint("InlinedApi")
class WebInitCompat {
public static final int LAYER_TYPE_NONE = WebInitCompat.isUseSupport() ? 0 : View.LAYER_TYPE_NONE;
public static final int LAYER_TYPE_SOFTWARE = WebInitCompat.isUseSupport() ? 1 : View.LAYER_TYPE_SOFTWARE;
public static final int LAYER_TYPE_HARDWARE = WebInitCompat.isUseSupport() ? 2 : View.LAYER_TYPE_HARDWARE;
private static boolean isUseSupport() {
return Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB;
}
interface WebApiCompatImpl {
public void setDefaultAttr(WebView view);
public void setDefaultSetting(WebView view);
}
static class EarlyWebApiCompatImpl implements WebApiCompatImpl {
@Override
public void setDefaultAttr(WebView view) {
// 去除滚动条白色背景,必须在代码里面添加才有效
view.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
view.setScrollbarFadingEnabled(true);
view.setDrawingCacheEnabled(true);
view.setLongClickable(true);
view.setBackgroundResource(android.R.color.transparent);
view.setBackgroundColor(Color.TRANSPARENT);
view.getBackground().setAlpha(0);
view.setFocusable(true);
view.setFocusableInTouchMode(true);
}
@SuppressLint("SetJavaScriptEnabled")
@Override
public void setDefaultSetting(WebView view) {
WebSettingsCompat settings = WebSettingsCompat.get(view);
// JavaScript 支持
settings.setJavaScriptEnabled(true);
settings.setJavaScriptCanOpenWindowsAutomatically(true); // 允许 JavaScript 弹出窗口
// web 图片
settings.setLoadsImagesAutomatically(true);
// WebView 去除缩放功能但隐藏缩放控件
settings.setSupportZoom(false);
settings.setBuiltInZoomControls(false);
settings.setDisplayZoomControls(false);
// 自适应屏幕
settings.setUseWideViewPort(true);
// 加载模式
settings.setLoadWithOverviewMode(true);
// 保持表单和密码
settings.setSaveFormData(false);
settings.setSavePassword(false);
// 线程优先级调整
settings.setRenderPriority(RenderPriority.HIGH);
// 用WebView显示图片,可使用这个参数
settings.setLayoutAlgorithm(LayoutAlgorithm.NORMAL);
settings.setSupportMultipleWindows(true);
// LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
// LOAD_DEFAULT: 根据cache-control决定是否从网络上取数据
// LOAD_CACHE_NORMAL: API level 17中已经废弃, 从API level
// 11开始作用同LOAD_DEFAULT模式
// LOAD_NO_CACHE: 不使用缓存,只从网络获取数据
// LOAD_CACHE_ELSE_NETWORK: 只要本地有,无论是否过期、或者no-cache,都使用缓存中的数据
// www.taobao.com的cache-control为no-cache,在模式LOAD_DEFAULT下,无论如何都会从网络上取数据,如果没有网络,就会出现错误页面;
// 在LOAD_CACHE_ELSE_NETWORK模式下,无论是否有网络,只要本地有缓存,都使用缓存。本地没有缓存时才从网络上获取
settings.setCacheMode(WebSettings.LOAD_DEFAULT);
// 开启 DOM storage API 功能
settings.setDomStorageEnabled(true);
// 开启 database storage API 功能
settings.setDatabaseEnabled(true);
// 开启 Application Caches 功能
settings.setAppCacheEnabled(true);
// 设置最大缓存值 8M
settings.setAppCacheMaxSize(8 * 1024 * 1024);
settings.setPluginState(PluginStateCompat.ON_DEMAND);
// 可以读取内容缓存
settings.setAllowContentAccess(true);
// 可以读取文件缓存(manifest生效)
settings.setAllowFileAccess(true);
settings.setAllowFileAccessFromFileURLs(true);
settings.setAllowUniversalAccessFromFileURLs(true);
}
}
static class HoneyCombWebApiCompatImpl extends EarlyWebApiCompatImpl {
@Override
public void setDefaultAttr(WebView view) {
super.setDefaultAttr(view);
// 防止加载图片白屏,为了透明
// WebInitCompatHoneyComb.setLayerType(view, LAYER_TYPE_SOFTWARE, null);
}
}
public static WebInitCompat get(WebView view) {
return new WebInitCompat(view);
}
private final WebView view;
private final WebApiCompatImpl impl;
private WebInitCompat(WebView view) {
this(Build.VERSION.SDK_INT, view);
}
private WebInitCompat(int apiVersion, WebView view) {
super();
if (apiVersion >= Build.VERSION_CODES.HONEYCOMB) {
impl = new HoneyCombWebApiCompatImpl();
} else {
impl = new EarlyWebApiCompatImpl();
}
this.view = view;
}
public void setDefaultAttr() {
impl.setDefaultAttr(view);
}
public void setDefaultSetting() {
impl.setDefaultSetting(view);
}
}