/*
* Created by LuaView.
* Copyright (c) 2017, Alibaba Group. All rights reserved.
*
* This source code is licensed under the MIT.
* For the full copyright and license information,please view the LICENSE file in the root directory of this source tree.
*/
package com.taobao.luaview.view;
import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Build;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.View;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import com.taobao.luaview.userdata.ui.UDView;
import com.taobao.luaview.userdata.ui.UDWebView;
import com.taobao.luaview.util.LuaUtil;
import com.taobao.luaview.util.LuaViewUtil;
import com.taobao.luaview.view.interfaces.ILVNativeViewProvider;
import com.taobao.luaview.view.interfaces.ILVView;
import org.luaj.vm2.Globals;
import org.luaj.vm2.LuaValue;
import org.luaj.vm2.Varargs;
import static org.luaj.vm2.LuaValue.valueOf;
/**
* Created by tuoli on 10/9/16.
*/
public class LVWebView extends SwipeRefreshLayout implements ILVNativeViewProvider, ILVView {
protected UDView mLuaUserdata;
protected WebView mWebView;
protected boolean mIsLoading;
public LVWebView(Globals globals, LuaValue metaTable, Varargs varargs) {
super(globals.getContext());
this.mLuaUserdata = new UDWebView(this, globals, metaTable, varargs);
init(globals.getContext());
}
private void init(Context context) {
this.mWebView = new WebView(context);
this.addView(this.mWebView, LuaViewUtil.createRelativeLayoutParamsMM());
this.mWebView.getSettings().setJavaScriptEnabled(true);
this.mWebView.getSettings().setSavePassword(false);
this.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh() {
mWebView.reload();
}
});
this.setEnabled(false); // 默认关闭下拉刷新功能
setupDefaultWebViewClient();
}
@TargetApi(Build.VERSION_CODES.M)
private void setupDefaultWebViewClient() {
if (mWebView != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false; // 使其不要在外部浏览器中响应
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
mIsLoading = true;
if (LuaUtil.isTable(mLuaUserdata.getCallback())) {
LuaUtil.callFunction(LuaUtil.getFunction(mLuaUserdata.getCallback(), "onPageStarted"));
}
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
mIsLoading = false;
if (LuaUtil.isTable(mLuaUserdata.getCallback())) {
LuaUtil.callFunction(LuaUtil.getFunction(mLuaUserdata.getCallback(), "onPageFinished"));
}
if (LVWebView.this.isRefreshing()) {
LVWebView.this.setRefreshing(false);
}
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
mIsLoading = false;
if (LuaUtil.isTable(mLuaUserdata.getCallback())) {
LuaUtil.callFunction(LuaUtil.getFunction(mLuaUserdata.getCallback(), "onReceivedError"),
valueOf(error.getErrorCode()),
valueOf(String.valueOf(error.getDescription())),
valueOf(String.valueOf(request.getUrl())));
}
if (LVWebView.this.isRefreshing()) {
LVWebView.this.setRefreshing(false);
}
}
});
} else {
mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false; // 使其不要在外部浏览器中响应
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
mIsLoading = true;
if (LuaUtil.isTable(mLuaUserdata.getCallback())) {
LuaUtil.callFunction(LuaUtil.getFunction(mLuaUserdata.getCallback(), "onPageStarted"));
}
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
mIsLoading = false;
if (LuaUtil.isTable(mLuaUserdata.getCallback())) {
LuaUtil.callFunction(LuaUtil.getFunction(mLuaUserdata.getCallback(), "onPageFinished"));
}
if (LVWebView.this.isRefreshing()) {
LVWebView.this.setRefreshing(false);
}
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
mIsLoading = false;
if (LuaUtil.isTable(mLuaUserdata.getCallback())) {
LuaUtil.callFunction(LuaUtil.getFunction(mLuaUserdata.getCallback(), "onReceivedError"), errorCode, description, failingUrl);
}
if (LVWebView.this.isRefreshing()) {
LVWebView.this.setRefreshing(false);
}
}
});
}
}
}
public WebView getWebView() {
return mWebView;
}
public boolean getLoadingState() {
return mIsLoading;
}
@Override
public UDView getUserdata() {
return mLuaUserdata;
}
@Override
public View getNativeView() {
return this.getWebView();
}
}