package com.v7lin.android.env.webkit;
import android.annotation.SuppressLint;
import android.os.Build;
import android.webkit.WebSettings;
import android.webkit.WebSettings.LayoutAlgorithm;
import android.webkit.WebSettings.RenderPriority;
import android.webkit.WebView;
/**
*
*
* @author v7lin Email:v7lin@qq.com
*/
@SuppressWarnings("deprecation")
public class WebSettingsCompat {
public enum PluginStateCompat {
ON,
ON_DEMAND,
OFF
}
public enum ZoomDensityCompat {
FAR,
MEDIUM,
CLOSE;
}
interface WebSettingsCompatImpl {
/**
* JavaScript 支持
*/
public void setJavaScriptEnabled(WebSettings settings, boolean flag);// early
public void setJavaScriptCanOpenWindowsAutomatically(WebSettings settings, boolean flag);// early
/**
* Web 图片
*/
public void setLoadsImagesAutomatically(WebSettings settings, boolean flag);// early
public boolean getLoadsImagesAutomatically(WebSettings settings);// early
public void setBlockNetworkImage(WebSettings settings, boolean flag);// early
public boolean getBlockNetworkImage(WebSettings settings);// early
/**
* encoding
*/
public void setDefaultTextEncodingName(WebSettings settings, String encoding);// early
/**
* WebView 去除缩放功能但隐藏缩放控件
*/
public void setDefaultZoom(WebSettings settings, ZoomDensityCompat zoom);// early
public void setSupportZoom(WebSettings settings, boolean enabled);// early
public void setBuiltInZoomControls(WebSettings settings, boolean enabled);// early
public void setDisplayZoomControls(WebSettings settings, boolean enabled);
/**
* 自适应屏幕
*/
public void setUseWideViewPort(WebSettings settings, boolean use);// early
/**
* 加载模式
*/
public void setLoadWithOverviewMode(WebSettings settings, boolean overview);
/**
* 保持表单和密码
*/
public void setSaveFormData(WebSettings settings, boolean save);// early
public void setSavePassword(WebSettings settings, boolean save);// early
/**
* 线程优先级调整
*/
public void setRenderPriority(WebSettings settings, RenderPriority priority);// early
/**
* 用WebView显示图片,可使用这个参数
*/
public void setLayoutAlgorithm(WebSettings settings, LayoutAlgorithm l);// early
public void setSupportMultipleWindows(WebSettings settings, boolean support);
/**
* @see WebSettings#LOAD_CACHE_ONLY 不使用网络,只读取本地缓存数据
*
* @see LOAD_DEFAULT 根据cache-control决定是否从网络上取数据
*
* @see LOAD_CACHE_NORMAL API level 17中已经废弃, 从API level 11开始作用同LOAD_DEFAULT模式
*
* @see LOAD_NO_CACHE 不使用缓存,只从网络获取数据
*
* @see LOAD_CACHE_ELSE_NETWORK 只要本地有,无论是否过期、或者no-cache,都使用缓存中的数据
*
* www.taobao.com的cache-control为no-cache,在模式LOAD_DEFAULT下,无论如何都会从网络上取数据,如果没有网络,就会出现错误页面
* 在LOAD_CACHE_ELSE_NETWORK模式下,无论是否有网络,只要本地有缓存,都使用缓存。本地没有缓存时才从网络上获取
*/
public void setCacheMode(WebSettings settings, int mode);// early
/**
* 开启 DOM storage API 功能
*/
public void setDomStorageEnabled(WebSettings settings, boolean flag);
/**
* 开启 database storage API 功能
*/
public void setDatabaseEnabled(WebSettings settings, boolean flag);// early
/**
* 开启 Application Caches 功能
*/
public void setAppCacheEnabled(WebSettings settings, boolean flag);
/**
* 设置最大缓存值 8M
*/
public void setAppCacheMaxSize(WebSettings settings, long appCacheMaxSize);
/**
* 设置缓存路径
*/
public void setAppCachePath(WebSettings settings, String appCachePath);
/**
* 插件
*/
public void setPluginState(WebSettings settings, PluginStateCompat state);
/**
* 可以读取内容缓存
*/
public void setAllowContentAccess(WebSettings settings, boolean allow);
/**
* 可以读取文件缓存(manifest生效)
*/
public void setAllowFileAccess(WebSettings settings, boolean allow);// early
public void setAllowFileAccessFromFileURLs(WebSettings settings, boolean flag);
public void setAllowUniversalAccessFromFileURLs(WebSettings settings, boolean flag);
public String getUserAgentString(WebSettings settings);
public void setUserAgentString(WebSettings settings, String ua);
}
static class EarlyWebSettingsCompatImpl implements WebSettingsCompatImpl {
@SuppressLint("SetJavaScriptEnabled")
@Override
public void setJavaScriptEnabled(WebSettings settings, boolean flag) {
settings.setJavaScriptEnabled(flag);
}
@Override
public void setJavaScriptCanOpenWindowsAutomatically(WebSettings settings, boolean flag) {
settings.setJavaScriptCanOpenWindowsAutomatically(flag);
}
@Override
public void setLoadsImagesAutomatically(WebSettings settings, boolean flag) {
settings.setLoadsImagesAutomatically(flag);
}
@Override
public boolean getLoadsImagesAutomatically(WebSettings settings) {
return settings.getLoadsImagesAutomatically();
}
@Override
public void setBlockNetworkImage(WebSettings settings, boolean flag) {
settings.setBlockNetworkImage(flag);
}
@Override
public boolean getBlockNetworkImage(WebSettings settings) {
return settings.getBlockNetworkImage();
}
@Override
public void setDefaultTextEncodingName(WebSettings settings, String encoding) {
settings.setDefaultTextEncodingName(encoding);
}
@Override
public void setDefaultZoom(WebSettings settings, ZoomDensityCompat zoom) {
}
@Override
public void setSupportZoom(WebSettings settings, boolean enabled) {
settings.setSupportZoom(enabled);
}
@Override
public void setBuiltInZoomControls(WebSettings settings, boolean enabled) {
settings.setBuiltInZoomControls(enabled);
}
@Override
public void setDisplayZoomControls(WebSettings settings, boolean enabled) {
}
@Override
public void setUseWideViewPort(WebSettings settings, boolean use) {
settings.setUseWideViewPort(use);
}
@Override
public void setLoadWithOverviewMode(WebSettings settings, boolean overview) {
}
@Override
public void setSaveFormData(WebSettings settings, boolean save) {
settings.setSaveFormData(save);
}
@Override
public void setSavePassword(WebSettings settings, boolean save) {
settings.setSavePassword(save);
}
@Override
public void setRenderPriority(WebSettings settings, RenderPriority priority) {
settings.setRenderPriority(priority);
}
@Override
public void setLayoutAlgorithm(WebSettings settings, LayoutAlgorithm l) {
settings.setLayoutAlgorithm(l);
}
@Override
public void setSupportMultipleWindows(WebSettings settings, boolean support) {
settings.setSupportMultipleWindows(support);
}
@Override
public void setCacheMode(WebSettings settings, int mode) {
settings.setCacheMode(mode);
}
@Override
public void setDomStorageEnabled(WebSettings settings, boolean flag) {
}
@Override
public void setDatabaseEnabled(WebSettings settings, boolean flag) {
settings.setDatabaseEnabled(flag);
}
@Override
public void setAppCacheEnabled(WebSettings settings, boolean flag) {
}
@Override
public void setAppCacheMaxSize(WebSettings settings, long appCacheMaxSize) {
}
@Override
public void setAppCachePath(WebSettings settings, String appCachePath) {
}
@Override
public void setPluginState(WebSettings settings, PluginStateCompat state) {
}
@Override
public void setAllowContentAccess(WebSettings settings, boolean allow) {
}
@Override
public void setAllowFileAccess(WebSettings settings, boolean allow) {
settings.setAllowFileAccess(allow);
}
@Override
public void setAllowFileAccessFromFileURLs(WebSettings settings, boolean flag) {
}
@Override
public void setAllowUniversalAccessFromFileURLs(WebSettings settings, boolean flag) {
}
@Override
public String getUserAgentString(WebSettings settings) {
return settings.getUserAgentString();
}
@Override
public void setUserAgentString(WebSettings settings, String ua) {
settings.setUserAgentString(ua);
}
}
// 2.1
static class EclairMr1WebSettingsCompatImpl extends EarlyWebSettingsCompatImpl {
@Override
public void setDefaultZoom(WebSettings settings, ZoomDensityCompat zoom) {
WebSettingsCompatEclairMr1.setDefaultZoom(settings, zoom);
}
@Override
public void setLoadWithOverviewMode(WebSettings settings, boolean overview) {
WebSettingsCompatEclairMr1.setLoadWithOverviewMode(settings, overview);
}
@Override
public void setDomStorageEnabled(WebSettings settings, boolean flag) {
WebSettingsCompatEclairMr1.setDomStorageEnabled(settings, flag);
}
@Override
public void setAppCacheEnabled(WebSettings settings, boolean flag) {
WebSettingsCompatEclairMr1.setAppCacheEnabled(settings, flag);
}
@Override
public void setAppCacheMaxSize(WebSettings settings, long appCacheMaxSize) {
WebSettingsCompatEclairMr1.setAppCacheMaxSize(settings, appCacheMaxSize);
}
@Override
public void setAppCachePath(WebSettings settings, String appCachePath) {
WebSettingsCompatEclairMr1.setAppCachePath(settings, appCachePath);
}
}
// 2.2
static class FroyoWebSettingsCompatImpl extends EclairMr1WebSettingsCompatImpl {
@Override
public void setPluginState(WebSettings settings, PluginStateCompat state) {
WebSettingsCompatFroyo.setPluginState(settings, state);
}
}
// 3.0
static class HoneyCombWebSettingsCompatImpl extends FroyoWebSettingsCompatImpl {
@Override
public void setDisplayZoomControls(WebSettings settings, boolean enabled) {
WebSettingsCompatHoneyComb.setDisplayZoomControls(settings, enabled);
}
@Override
public void setAllowContentAccess(WebSettings settings, boolean allow) {
WebSettingsCompatHoneyComb.setAllowContentAccess(settings, allow);
}
}
// 4.1
static class JellyBeanWebSettingsCompatImpl extends HoneyCombWebSettingsCompatImpl {
@Override
public void setAllowFileAccessFromFileURLs(WebSettings settings, boolean flag) {
WebSettingsCompatJellyBean.setAllowFileAccessFromFileURLs(settings, flag);
}
@Override
public void setAllowUniversalAccessFromFileURLs(WebSettings settings, boolean flag) {
WebSettingsCompatJellyBean.setAllowUniversalAccessFromFileURLs(settings, flag);
}
}
public static WebSettingsCompat get(WebView view) {
return new WebSettingsCompat(view);
}
private final WebSettings settings;
private final WebSettingsCompatImpl impl;
private WebSettingsCompat(WebView view) {
this(Build.VERSION.SDK_INT, view);
}
private WebSettingsCompat(int apiVersion, WebView view) {
super();
if (apiVersion >= Build.VERSION_CODES.JELLY_BEAN) {
impl = new JellyBeanWebSettingsCompatImpl();
} else if (apiVersion >= Build.VERSION_CODES.HONEYCOMB) {
impl = new HoneyCombWebSettingsCompatImpl();
} else if (apiVersion >= Build.VERSION_CODES.FROYO) {
impl = new FroyoWebSettingsCompatImpl();
} else if (apiVersion >= Build.VERSION_CODES.ECLAIR_MR1) {
impl = new EclairMr1WebSettingsCompatImpl();
} else {
impl = new EarlyWebSettingsCompatImpl();
}
settings = view.getSettings();
}
public void setJavaScriptEnabled(boolean flag) {
impl.setJavaScriptEnabled(settings, flag);
}
public void setJavaScriptCanOpenWindowsAutomatically(boolean flag) {
impl.setJavaScriptCanOpenWindowsAutomatically(settings, flag);
}
public void setLoadsImagesAutomatically(boolean flag) {
impl.setLoadsImagesAutomatically(settings, flag);
}
public boolean getLoadsImagesAutomatically() {
return impl.getLoadsImagesAutomatically(settings);
}
public void setBlockNetworkImage(boolean flag) {
impl.setBlockNetworkImage(settings, flag);
}
public boolean getBlockNetworkImage() {
return impl.getBlockNetworkImage(settings);
}
public void setDefaultTextEncodingName(String encoding) {
impl.setDefaultTextEncodingName(settings, encoding);
}
public void setDefaultZoom(ZoomDensityCompat zoom) {
impl.setDefaultZoom(settings, zoom);
}
public void setSupportZoom(boolean enabled) {
impl.setSupportZoom(settings, enabled);
}
public void setBuiltInZoomControls(boolean enabled) {
impl.setBuiltInZoomControls(settings, enabled);
}
public void setDisplayZoomControls(boolean enabled) {
impl.setDisplayZoomControls(settings, enabled);
}
public void setUseWideViewPort(boolean use) {
impl.setUseWideViewPort(settings, use);
}
public void setLoadWithOverviewMode(boolean overview) {
impl.setLoadWithOverviewMode(settings, overview);
}
public void setSaveFormData(boolean save) {
impl.setSaveFormData(settings, save);
}
public void setSavePassword(boolean save) {
impl.setSavePassword(settings, save);
}
public void setRenderPriority(RenderPriority priority) {
impl.setRenderPriority(settings, priority);
}
public void setLayoutAlgorithm(LayoutAlgorithm l) {
impl.setLayoutAlgorithm(settings, l);
}
public void setSupportMultipleWindows(boolean support) {
impl.setSupportMultipleWindows(settings, support);
}
public void setCacheMode(int mode) {
impl.setCacheMode(settings, mode);
}
public void setDomStorageEnabled(boolean flag) {
impl.setDomStorageEnabled(settings, flag);
}
public void setDatabaseEnabled(boolean flag) {
impl.setDatabaseEnabled(settings, flag);
}
public void setAppCacheEnabled(boolean flag) {
impl.setAppCacheEnabled(settings, flag);
}
public void setAppCacheMaxSize(long appCacheMaxSize) {
impl.setAppCacheMaxSize(settings, appCacheMaxSize);
}
public void setAppCachePath(String appCachePath) {
impl.setAppCachePath(settings, appCachePath);
}
public void setPluginState(PluginStateCompat state) {
impl.setPluginState(settings, state);
}
public void setAllowContentAccess(boolean allow) {
impl.setAllowContentAccess(settings, allow);
}
public void setAllowFileAccess(boolean allow) {
impl.setAllowFileAccess(settings, allow);
}
public void setAllowFileAccessFromFileURLs(boolean flag) {
impl.setAllowFileAccessFromFileURLs(settings, flag);
}
public void setAllowUniversalAccessFromFileURLs(boolean flag) {
impl.setAllowUniversalAccessFromFileURLs(settings, flag);
}
public String getUserAgentString() {
return impl.getUserAgentString(settings);
}
public void setUserAgentString(String ua) {
impl.setUserAgentString(settings, ua);
}
}