package com.yuyh.sprintnba.widget;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.webkit.ConsoleMessage;
import android.webkit.CookieManager;
import android.webkit.CookieSyncManager;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceError;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import com.yuyh.library.utils.StringUtils;
import com.yuyh.library.utils.log.LogUtils;
import com.yuyh.library.utils.toast.ToastUtils;
import com.yuyh.sprintnba.app.Constant;
import com.yuyh.sprintnba.base.BaseAppManager;
import com.yuyh.sprintnba.base.BaseWebActivity;
import com.yuyh.sprintnba.http.utils.RequestHelper;
import com.yuyh.sprintnba.ui.ImagePreViewActivity;
import com.yuyh.sprintnba.ui.LoginActivity;
import com.yuyh.sprintnba.ui.PostActivity;
import com.yuyh.sprintnba.ui.ReportActivity;
import com.yuyh.sprintnba.ui.ThreadDetailActivity;
import com.yuyh.sprintnba.ui.ThreadListActivity;
import com.yuyh.sprintnba.utils.SettingPrefUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
/**
* 虎扑帖子详情页
*/
public class HuPuWebView extends WebView {
private String basicUA;
private Map<String, String> header;
RequestHelper mRequestHelper;
public HuPuWebView(Context context) {
this(context, null);
}
public HuPuWebView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public HuPuWebView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
WebSettings settings = getSettings();
settings.setBuiltInZoomControls(false);
settings.setSupportZoom(false);
settings.setJavaScriptEnabled(true);
settings.setAllowFileAccess(true);
settings.setSupportMultipleWindows(false);
settings.setJavaScriptCanOpenWindowsAutomatically(true);
settings.setDomStorageEnabled(true);
settings.setCacheMode(WebSettings.LOAD_DEFAULT);
settings.setUseWideViewPort(true);
if (Build.VERSION.SDK_INT > 6) {
settings.setAppCacheEnabled(true);
settings.setLoadWithOverviewMode(true);
}
String path = getContext().getFilesDir().getPath();
settings.setGeolocationEnabled(true);
settings.setGeolocationDatabasePath(path);
settings.setDomStorageEnabled(true);
this.basicUA = settings.getUserAgentString() + " kanqiu/7.05.6303/7059";
setBackgroundColor(0);
initWebViewClient();
setWebChromeClient(new HuPuChromeClient());
try {
if (SettingPrefUtils.isLogin()) {
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setCookie("http://bbs.mobileapi.hupu.com", "u=" + SettingPrefUtils.getCookies());
cookieManager.setCookie("http://bbs.mobileapi.hupu.com", "_gamesu=" + URLEncoder.encode(SettingPrefUtils.getToken(), "utf-8"));
cookieManager.setCookie("http://bbs.mobileapi.hupu.com", "_inKanqiuApp=1");
cookieManager.setCookie("http://bbs.mobileapi.hupu.com", "_kanqiu=1");
CookieSyncManager.getInstance().sync();
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void initWebViewClient() {
CookieManager.getInstance().setAcceptCookie(true);
setWebViewClient(new HupuWebClient());
}
public void setCallBack(HuPuWebViewCallBack callBack) {
this.callBack = callBack;
}
public class HuPuChromeClient extends WebChromeClient {
@Override
public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
LogUtils.d("onConsoleMessage:" + consoleMessage.message() + ":" + consoleMessage.lineNumber());
return true;
}
}
private class HupuWebClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) { // 超链接监听
LogUtils.d(Uri.decode(url));
Uri uri = Uri.parse(url);
String scheme = uri.getScheme();
if (scheme != null) {
handleScheme(scheme, url);
}
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
if (callBack != null) {
callBack.onFinish();
}
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
if (callBack != null) {
callBack.onError();
}
}
}
/**
* 解析网页超链接
*
* @param scheme
* @param url
*/
private void handleScheme(String scheme, String url) {
if (scheme != null) {
if (scheme.equalsIgnoreCase("kanqiu")) {
handleKanQiu(url);
} else if (scheme.equalsIgnoreCase("browser")
|| scheme.equalsIgnoreCase("http")
|| scheme.equalsIgnoreCase("https")) {
handleUrl(url);
} else if (scheme.equalsIgnoreCase("hupu")) {
try {
JSONObject object = new JSONObject(Uri.decode(url.substring("hupu".length() + 3)));
String method = object.optString("method");
String successcb = object.optString("successcb");
handleHuPu(method, object.getJSONObject("data"), successcb);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
private void handleKanQiu(String url) {
if (url.contains("topic")) {
Uri uri = Uri.parse(url);
String tid = uri.getLastPathSegment();
LogUtils.d("tid:" + tid);
String page = uri.getQueryParameter("page");
LogUtils.d("page:" + page);
String pid = uri.getQueryParameter("pid");
LogUtils.d("pid:" + pid);
ThreadDetailActivity.start(getContext(), pid, tid,
TextUtils.isEmpty(page) ? 1 : Integer.valueOf(page), "");
} else if (url.contains("board")) {
String boardId = url.substring(url.lastIndexOf("/") + 1);
ThreadListActivity.start(getContext(), boardId);
} else if (url.contains("people")) {
String uid = url.substring(url.lastIndexOf("/") + 1);
// TODO UserProfileActivity.startActivity(getContext(), uid);
}
}
/**
* 跳转
*
* @param url
*/
private void handleUrl(String url) {
BaseWebActivity.start(getContext(), url, "", true, true);
}
private void handleHuPu(String method, JSONObject data, String successcb) throws Exception {
switch (method) {
case "bridgeReady":
JSONObject jSONObject = new JSONObject();
try {
jSONObject.put("hybridVer", "1.0");
jSONObject.put("supportAjax", true);
jSONObject.put("appVer", "7.0.5.6303");
jSONObject.put("appName", "com.hupu.games");
jSONObject.put("lowDevice", false);
jSONObject.put("scheme", "hupu");
jSONObject.put("did", Constant.deviceId);
jSONObject.put("platform", "Android");
jSONObject.put("device", Build.PRODUCT);
jSONObject.put("osVer", Build.VERSION.RELEASE);
} catch (JSONException e) {
e.printStackTrace();
}
String js = "javascript:HupuBridge._handle_('"
+ successcb
+ "','"
+ jSONObject.toString()
+ "','null','null');";
loadUrl(js);
break;
case "hupu.ui.updatebbspager":
int page = data.getInt("page");
int total = data.getInt("total");
if (callBack != null) {
callBack.onUpdatePager(page, total);
}
break;
case "hupu.ui.bbsreply":
boolean open = data.getBoolean("open");
JSONObject extra = data.getJSONObject("extra");
String tid = extra.getString("tid");
long pid = extra.getLong("pid");
String userName = extra.getString("username");
String content = extra.getString("content");
if (open) {
PostActivity.start(getContext(), content, Constant.TYPE_REPLY, "", tid, String.valueOf(pid));
}
break;
case "hupu.album.view":
int index = data.getInt("index");
JSONArray images = data.getJSONArray("images");
ArrayList<String> extraPics = new ArrayList<>();
for (int i = 0; i < images.length(); i++) {
JSONObject image = images.getJSONObject(i);
extraPics.add(image.getString("url"));
}
Intent intent = new Intent(getContext(), ImagePreViewActivity.class);
intent.putExtra(ImagePreViewActivity.INTENT_URLS, extraPics);
intent.putExtra(ImagePreViewActivity.INTENT_URL, extraPics.get(index));
getContext().startActivity(intent);
break;
case "hupu.ui.copy":
String content1 = data.getString("content");
StringUtils.copy(getContext(), content1);
break;
case "hupu.ui.report":
JSONObject reportExtra = data.getJSONObject("extra");
String reportTid = reportExtra.getString("tid");
long reportPid = reportExtra.getLong("pid");
ReportActivity.start(getContext(), String.valueOf(reportPid), reportTid);
break;
case "hupu.user.login":
getContext().startActivity(new Intent(getContext(), LoginActivity.class));
ToastUtils.showToast("请先登录哦~");
break;
case "hupu.ui.pageclose":
BaseAppManager.getInstance().getForwardActivity().finish();
break;
}
}
private void setUA(int i) {
if (this.basicUA != null) {
getSettings().setUserAgentString(this.basicUA + " isp/" + i + " network/" + i);
}
}
public void loadUrl(String url) {
LogUtils.d("loadUrl:" + url);
setUA(-1);
if (header == null) {
header = new HashMap<>();
header.put("Accept-Encoding", "gzip");
}
super.loadUrl(url, header);
}
private HuPuWebViewCallBack callBack;
public interface HuPuWebViewCallBack {
void onFinish();
void onUpdatePager(int page, int total);
void onError();
}
private OnScrollChangedCallback mOnScrollChangedCallback;
@Override
protected void onScrollChanged(final int l, final int t, final int oldl, final int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if (mOnScrollChangedCallback != null) {
mOnScrollChangedCallback.onScroll(l - oldl, t - oldt, t, oldt);
}
}
public OnScrollChangedCallback getOnScrollChangedCallback() {
return mOnScrollChangedCallback;
}
public void setOnScrollChangedCallback(final OnScrollChangedCallback onScrollChangedCallback) {
mOnScrollChangedCallback = onScrollChangedCallback;
}
/**
* Impliment in the activity/fragment/view that you want to listen to the webview
*/
public interface OnScrollChangedCallback {
void onScroll(int dx, int dy, int y, int oldy);
}
}