package cn.darkal.networkdiagnosis.Fragment;
import android.annotation.TargetApi;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.support.v4.widget.SwipeRefreshLayout;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.webkit.ConsoleMessage;
import android.webkit.DownloadListener;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import butterknife.BindView;
import butterknife.ButterKnife;
import cn.darkal.networkdiagnosis.Activity.MainActivity;
import cn.darkal.networkdiagnosis.R;
import cn.darkal.networkdiagnosis.SysApplication;
import cn.darkal.networkdiagnosis.Utils.DeviceUtils;
import cn.darkal.networkdiagnosis.Utils.ProxyUtils;
import cn.darkal.networkdiagnosis.Utils.SharedPreferenceUtils;
public class WebViewFragment extends BaseFragment {
@BindView(R.id.fl_webview)
WebView webView;
@BindView(R.id.bt_jump)
Button jumpButton;
@BindView(R.id.et_url)
EditText urlText;
@BindView(R.id.pb_progress)
ProgressBar progressBar;
@BindView(R.id.swipe_container)
SwipeRefreshLayout swipeRefreshLayout;
Receiver receiver;
public Boolean isSetProxy = false;
public String baseUserAgentString = "Mozilla/5.0 (Linux; Android 5.0.2) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0";
public String userAgentString = baseUserAgentString;
private final static WebViewFragment webViewFragment = new WebViewFragment();
public static WebViewFragment getInstance() {
return webViewFragment;
}
@Override
public boolean onBackPressed() {
if (webView.canGoBack()) {
webView.goBack();
return true;
} else {
return false;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_webview, container, false);
ButterKnife.bind(this, view);
isSetProxy = false;
urlText.setText(MainActivity.HOME_URL);
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setAllowFileAccess(true);
webSettings.setDatabaseEnabled(true);
String dir = getActivity().getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath();
webSettings.setDatabasePath(dir);
webSettings.setDomStorageEnabled(true);
webSettings.setGeolocationEnabled(true);
baseUserAgentString = webSettings.getUserAgentString()+" jdhttpmonitor/" + DeviceUtils.getVersion(getContext());
webSettings.setUserAgentString(userAgentString);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
webView.setDownloadListener(new MyWebViewDownLoadListener());
webView.setWebViewClient(new WebViewClient() {
// @Override
// public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
// if(request.getUrl().toString().startsWith("jdhttpmonitor://webview")) {
// Intent intent = new Intent("android.intent.action.VIEW");
// intent.setData(Uri.parse(request.getUrl().toString()));
// startActivity(intent);
// return true;
// }
// return false;
// }
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if(url.startsWith("jdhttpmonitor://webview")) {
Intent intent = new Intent("android.intent.action.VIEW");
intent.setData(Uri.parse(url));
startActivity(intent);
return true;
}
return false;
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
urlText.setText(url);
}
});
webView.setWebChromeClient(new WebChromeClient() {
// @Override
// public void onConsoleMessage(String message, int lineNumber, String sourceID) {
// super.onConsoleMessage(message, lineNumber, sourceID);
// ((MainActivity)getActivity()).consoleLog.append(message).append("\n").append("\n");
// }
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
((MainActivity)getActivity()).consoleLog.append(consoleMessage.message()).append("\n").append("\n");
return super.onConsoleMessage(consoleMessage);
}
public void onProgressChanged(WebView view, int progress) {
progressBar.setProgress(progress);
if (progress == 100) {
progressBar.setVisibility(View.GONE);
swipeRefreshLayout.setRefreshing(false);
} else {
progressBar.setVisibility(View.VISIBLE);
}
}
});
jumpButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (urlText.getText().length() > 0) {
loadUrl(urlText.getText() + "");
}
}
});
urlText.setImeOptions(EditorInfo.IME_ACTION_GO);
urlText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
//当actionId == XX_SEND 或者 XX_DONE时都触发
//或者event.getKeyCode == ENTER 且 event.getAction == ACTION_DOWN时也触发
//注意,这是一定要判断event != null。因为在某些输入法上会返回null。
if (actionId == EditorInfo.IME_ACTION_GO
|| actionId == EditorInfo.IME_ACTION_DONE
|| (event != null && KeyEvent.KEYCODE_ENTER == event.getKeyCode()
&& KeyEvent.ACTION_DOWN == event.getAction())) {
if (urlText.getText().length() > 0) {
loadUrl(v.getText() + "");
InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm != null) {
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
}
}
//处理事件
}
return false;
}
});
swipeRefreshLayout.setColorSchemeResources(R.color.colorAccentDark,R.color.colorAccent);
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
//重新刷新页面
webView.loadUrl(webView.getUrl());
}
});
initProxyWebView();
return view;
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// initProxyWebView();
((MainActivity) getActivity()).navigationView.getMenu().getItem(0).setChecked(true);
}
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
receiver = new Receiver();
getActivity().registerReceiver(receiver, new IntentFilter("proxyfinished"));
}
@Override
public void onDestroyView() {
super.onDestroyView();
getActivity().unregisterReceiver(receiver);
}
public void initProxyWebView() {
if (getActivity() != null && SysApplication.isInitProxy && !isSetProxy) {
webView.post(new Runnable() {
@Override
public void run() {
if(ProxyUtils.setProxy(webView, "127.0.0.1", SysApplication.proxyPort)){
Log.e("~~~~", "initProxyWebView()");
webView.loadUrl(urlText.getText() + "");
isSetProxy = true;
}else{
Toast.makeText(webView.getContext(),"Set proxy fail!",Toast.LENGTH_LONG).show();
}
}
});
}
}
public class Receiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
initProxyWebView();
Log.i("~~~~", "Receiver initProxyWebView");
}
}
public void loadUrl(String url) {
if (webView != null) {
if (!isSetProxy) {
ProxyUtils.setProxy(webView, "127.0.0.1", SysApplication.proxyPort);
Log.e("~~~~", "initProxyWebView()");
isSetProxy = true;
}
if (!url.startsWith("http://") && !url.startsWith("https://")) {
url = "http://" + url;
}
urlText.setText(url);
webView.loadUrl(url);
}
}
@Override
public void onResume() {
super.onResume();
setUserAgent();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
public void setUserAgent(){
String originUA = userAgentString;
switch (SharedPreferenceUtils.getString(getContext(),"select_ua", "0")) {
case "0":
userAgentString = baseUserAgentString;
break;
case "1":
userAgentString = baseUserAgentString + " MQQBrowser/6.2 TBS/036524 MicroMessenger/6.3.18.800 NetType/WIFI Language/zh_CN";
break;
case "2":
userAgentString = baseUserAgentString + " MQQBrowser/6.2 TBS/036524 V1_AND_SQ_6.0.0_300_YYB_D QQ/6.0.0.2605 NetType/WIFI WebP/0.3.0 Pixel/1440";
break;
}
WebSettings webSettings = webView.getSettings();
webSettings.setUserAgentString(userAgentString);
if(!originUA.equals(userAgentString) && webView!=null){
reload();
}
}
public void reload(){
if(webView!=null && webView.getUrl()!=null) {
webView.reload();
}
}
private class MyWebViewDownLoadListener implements DownloadListener {
@Override
public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype,
long contentLength) {
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}
}
}