content: /*
   * 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();
      }
  }
  