package com.gzsll.hupu.widget; import android.content.Context; import android.net.Uri; import android.os.Build; import android.text.TextUtils; import android.util.AttributeSet; import android.webkit.CookieManager; import android.webkit.CookieSyncManager; import android.webkit.WebResourceError; import android.webkit.WebResourceRequest; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; import com.gzsll.hupu.AppManager; import com.gzsll.hupu.Constants; import com.gzsll.hupu.MyApplication; import com.gzsll.hupu.components.retrofit.RequestHelper; import com.gzsll.hupu.components.storage.UserStorage; import com.gzsll.hupu.ui.browser.BrowserActivity; import com.gzsll.hupu.ui.content.ContentActivity; import com.gzsll.hupu.ui.imagepreview.ImagePreviewActivity; import com.gzsll.hupu.ui.login.LoginActivity; import com.gzsll.hupu.ui.post.PostActivity; import com.gzsll.hupu.ui.report.ReportActivity; import com.gzsll.hupu.ui.thread.list.ThreadListActivity; import com.gzsll.hupu.ui.userprofile.UserProfileActivity; import com.gzsll.hupu.util.StringUtil; import com.gzsll.hupu.util.ToastUtil; 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; import javax.inject.Inject; /** * Created by sll on 2015/12/10. */ public class HuPuWebView extends WebView { private String basicUA; private Map<String, String> header; @Inject UserStorage mUserStorage; @Inject RequestHelper mRequestHelper; public HuPuWebView(Context context) { super(context); init(); } public HuPuWebView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public void setCallBack(HuPuWebViewCallBack callBack) { this.callBack = callBack; } private void init() { ((MyApplication) getContext().getApplicationContext()).getApplicationComponent().inject(this); 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(1); settings.setUseWideViewPort(true); if (Build.VERSION.SDK_INT > 6) { settings.setAppCacheEnabled(true); settings.setLoadWithOverviewMode(true); } settings.setCacheMode(WebSettings.LOAD_DEFAULT); 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(); try { if (mUserStorage.isLogin()) { String token = mUserStorage.getToken(); CookieManager cookieManager = CookieManager.getInstance(); cookieManager.setCookie("http://bbs.mobileapi.hupu.com", "u=" + URLEncoder.encode(mUserStorage.getCookie(), "utf-8")); cookieManager.setCookie("http://bbs.mobileapi.hupu.com", "_gamesu=" + URLEncoder.encode(token, "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()); } private class HupuWebClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { Uri uri = Uri.parse(url); String scheme = uri.getScheme(); if (url.startsWith("hupu") || url.startsWith("kanqiu")) { if (scheme != null) { handleScheme(scheme, url); } } else if (scheme.equals("http") || scheme.equals("https")) { BrowserActivity.startActivity(getContext(), 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(); } } } 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")) { BrowserActivity.startActivity(getContext(), 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(); String page = uri.getQueryParameter("page"); String pid = uri.getQueryParameter("pid"); ContentActivity.startActivity(getContext(), "", tid, pid, TextUtils.isEmpty(page) ? 1 : Integer.valueOf(page)); } else if (url.contains("board")) { String boardId = url.substring(url.lastIndexOf("/") + 1); ThreadListActivity.startActivity(getContext(), boardId); } else if (url.contains("people")) { String uid = url.substring(url.lastIndexOf("/") + 1); UserProfileActivity.startActivity(getContext(), uid); } } 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", mRequestHelper.getDeviceId()); 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.startActivity(getContext(), Constants.TYPE_REPLY, "", tid, String.valueOf(pid), content); } 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")); } ImagePreviewActivity.startActivity(getContext(), extraPics.get(index), extraPics); break; case "hupu.ui.copy": String copy = data.getString("content"); StringUtil.copy(getContext(), copy); break; case "hupu.ui.report": JSONObject reportExtra = data.getJSONObject("extra"); String reportTid = reportExtra.getString("tid"); long reportPid = reportExtra.getLong("pid"); ReportActivity.startActivity(getContext(), reportTid, String.valueOf(reportPid)); break; case "hupu.user.login": LoginActivity.startActivity(getContext()); ToastUtil.showToast("请先登录"); break; case "hupu.ui.pageclose": AppManager.getAppManager().finishActivity(); break; } } private void setUA(int i) { if (this.basicUA != null) { getSettings().setUserAgentString(this.basicUA + " isp/" + i + " network/" + i); } } public void loadUrl(String 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); } } 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); } }