ex

Fork of mbed-os-example-mbed5-blinky by mbed-os-examples

Revision:
45:2aa9f933c8d2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dcs-sdk-java-master/app/src/main/java/com/baidu/duer/dcs/androidsystemimpl/webview/BaseWebView.java	Tue Jul 18 16:34:48 2017 +0800
@@ -0,0 +1,224 @@
+/*
+ * Copyright (c) 2017 Baidu, Inc. All Rights Reserved.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.baidu.duer.dcs.androidsystemimpl.webview;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.net.http.SslError;
+import android.os.Build;
+import android.util.AttributeSet;
+import android.webkit.CookieManager;
+import android.webkit.CookieSyncManager;
+import android.webkit.DownloadListener;
+import android.webkit.SslErrorHandler;
+import android.webkit.WebSettings;
+import android.webkit.WebSettings.PluginState;
+import android.webkit.WebView;
+import android.webkit.WebViewClient;
+
+import com.baidu.duer.dcs.systeminterface.IWebView;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * common webView
+ * <p>
+ * Created by zhangyan42@baidu.com on 2017/5/19.
+ */
+@SuppressLint("SetJavaScriptEnabled")
+public class BaseWebView extends WebView implements IWebView {
+    private final List<IWebViewListener> webViewListeners =
+            Collections.synchronizedList(new ArrayList<IWebViewListener>());
+
+    public BaseWebView(Context context, AttributeSet attrs) {
+        super(context, attrs);
+        init(context);
+    }
+
+    public BaseWebView(Context context, AttributeSet attrs, int defStyle) {
+        super(context, attrs, defStyle);
+        init(context);
+    }
+
+    public BaseWebView(Context context) {
+        super(context);
+        init(context);
+    }
+
+    @SuppressWarnings("deprecation")
+    @SuppressLint("NewApi")
+    private void init(Context context) {
+        this.setVerticalScrollBarEnabled(false);
+        this.setHorizontalScrollBarEnabled(false);
+        if (Build.VERSION.SDK_INT < 19) {
+            removeJavascriptInterface("searchBoxJavaBridge_");
+        }
+
+        WebSettings localWebSettings = this.getSettings();
+        try {
+            // 禁用file协议,http://www.tuicool.com/articles/Q36ZfuF, 防止Android WebView File域攻击
+            localWebSettings.setAllowFileAccess(false);
+            localWebSettings.setSupportZoom(false);
+            localWebSettings.setBuiltInZoomControls(false);
+            localWebSettings.setUseWideViewPort(true);
+            localWebSettings.setDomStorageEnabled(true);
+            localWebSettings.setLoadWithOverviewMode(true);
+            localWebSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
+            localWebSettings.setPluginState(PluginState.ON);
+            // 启用数据库
+            localWebSettings.setDatabaseEnabled(true);
+            // 设置定位的数据库路径
+            String dir = context.getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath();
+            localWebSettings.setGeolocationDatabasePath(dir);
+            localWebSettings.setGeolocationEnabled(true);
+            localWebSettings.setJavaScriptEnabled(true);
+            localWebSettings.setSavePassword(false);
+            String agent = localWebSettings.getUserAgentString();
+
+            localWebSettings.setUserAgentString(agent);
+            // setCookie(context, ".baidu.com", bdussCookie);
+
+        } catch (Exception e1) {
+            e1.printStackTrace();
+        }
+        this.setWebViewClient(new BridgeWebViewClient());
+    }
+
+    private void setCookie(Context context, String domain, String sessionCookie) {
+        CookieSyncManager.createInstance(context);
+        CookieManager cookieManager = CookieManager.getInstance();
+        cookieManager.setAcceptCookie(true);
+        if (sessionCookie != null) {
+            // delete old cookies
+            cookieManager.removeSessionCookie();
+        }
+        try {
+            Thread.sleep(200);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        cookieManager.setCookie(domain, sessionCookie);
+
+        CookieSyncManager.createInstance(context);
+        CookieSyncManager.getInstance().sync();
+    }
+
+    public void setDownloadListener(DownloadListener listener) {
+        super.setDownloadListener(listener);
+    }
+
+    private WebViewClientListener webViewClientListen;
+
+    public void setWebViewClientListen(WebViewClientListener webViewClientListen) {
+        this.webViewClientListen = webViewClientListen;
+    }
+
+    /**
+     * 枚举网络加载返回状态 STATUS_FALSE:false
+     * STATUS_TRUE:true
+     * STATUS_UNKNOW:不知道
+     * NET_UNKNOWN:未知网络
+     */
+    public enum LoadingWebStatus {
+        STATUS_FALSE, STATUS_TRUE, STATUS_UNKNOW
+    }
+
+    @Override
+    public void linkClicked(String url) {
+        fireLinkClicked(url);
+    }
+
+    @Override
+    public void addWebViewListener(IWebViewListener listener) {
+        this.webViewListeners.add(listener);
+    }
+
+    void fireLinkClicked(String url) {
+        for (IWebViewListener listener : webViewListeners) {
+            listener.onLinkClicked(url);
+        }
+    }
+
+    public interface WebViewClientListener {
+        LoadingWebStatus shouldOverrideUrlLoading(WebView view, String url);
+
+        void onPageStarted(WebView view, String url, Bitmap favicon);
+
+        void onPageFinished(WebView view, String url);
+
+        void onReceivedError(WebView view, int errorCode, String description, String failingUrl);
+    }
+
+    public class BridgeWebViewClient extends WebViewClient {
+        @Override
+        public boolean shouldOverrideUrlLoading(WebView view, String url) {
+            LoadingWebStatus loadWebStatus = LoadingWebStatus.STATUS_UNKNOW;
+            String mUrl = url;
+            try {
+                mUrl = URLDecoder.decode(url, "UTF-8");
+            } catch (UnsupportedEncodingException e) {
+                e.printStackTrace();
+            } catch (IllegalArgumentException e) {
+                e.printStackTrace();
+            }
+            if (null != webViewClientListen) {
+                loadWebStatus = webViewClientListen.shouldOverrideUrlLoading(view, url);
+            }
+            if (LoadingWebStatus.STATUS_FALSE == loadWebStatus) {
+                return false;
+            } else if (LoadingWebStatus.STATUS_TRUE == loadWebStatus) {
+                return true;
+            } else {
+                return super.shouldOverrideUrlLoading(view, url);
+            }
+        }
+
+        @Override
+        public void onPageStarted(WebView view, String url, Bitmap favicon) {
+            super.onPageStarted(view, url, favicon);
+            if (null != webViewClientListen) {
+                webViewClientListen.onPageStarted(view, url, favicon);
+            }
+        }
+
+        @Override
+        public void onPageFinished(WebView view, String url) {
+            super.onPageFinished(view, url);
+            if (null != webViewClientListen) {
+                webViewClientListen.onPageFinished(view, url);
+            }
+        }
+
+        @Override
+        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
+            super.onReceivedError(view, errorCode, description, failingUrl);
+            if (null != webViewClientListen) {
+                webViewClientListen.onReceivedError(view, errorCode, description, failingUrl);
+            }
+        }
+
+        @Override
+        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
+            // 当发生证书认证错误时,采用默认的处理方法handler.cancel(),停止加载问题页面
+            handler.cancel();
+        }
+    }
+}
\ No newline at end of file