package com.justwayward.reader.ui.activity; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.AsyncTask; import android.support.v4.view.MenuItemCompat; import android.support.v7.widget.SearchView; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.webkit.WebChromeClient; import android.webkit.WebResourceRequest; import android.webkit.WebResourceResponse; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.ProgressBar; import com.justwayward.reader.R; import com.justwayward.reader.base.BaseActivity; import com.justwayward.reader.base.Constant; import com.justwayward.reader.component.AppComponent; import com.justwayward.reader.view.chmview.Utils; import java.io.File; import java.io.IOException; import java.lang.reflect.Method; import java.util.ArrayList; import butterknife.Bind; /** * @author yuyh. * @date 2016/12/19. */ public class ReadCHMActivity extends BaseActivity { public static void start(Context context, String filePath) { Intent intent = new Intent(context, ReadCHMActivity.class); intent.setAction(Intent.ACTION_VIEW); intent.setData(Uri.fromFile(new File(filePath))); context.startActivity(intent); } @Bind(R.id.progressBar) ProgressBar mProgressBar; @Bind(R.id.webview) WebView mWebView; private String chmFileName; public String chmFilePath = "", extractPath, md5File; private ArrayList<String> listSite; private ArrayList<String> listBookmark; @Override public int getLayoutId() { return R.layout.activity_read_chm; } @Override protected void setupActivityComponent(AppComponent appComponent) { } @Override public void initToolBar() { chmFilePath = Uri.decode(getIntent().getDataString().replace("file://", "")); chmFileName = chmFilePath.substring(chmFilePath.lastIndexOf("/") + 1, chmFilePath.lastIndexOf(".")); mCommonToolbar.setTitle(chmFileName); mCommonToolbar.setNavigationIcon(R.drawable.ab_back); } @Override public void initDatas() { Utils.chm = null; listSite = new ArrayList<>(); } @Override public void configViews() { initVweView(); initFile(); } private void initVweView() { mProgressBar.setMax(100); mWebView.getSettings().setJavaScriptEnabled(true); mWebView.setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView view, int newProgress) { super.onProgressChanged(view, newProgress); visible(mProgressBar); mProgressBar.setProgress(newProgress); } }); mWebView.setWebViewClient(new WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { if (!url.startsWith("http") && !url.endsWith(md5File)) { String temp = url.substring("file://".length()); if (!temp.startsWith(extractPath)) { url = "file://" + extractPath + temp; } } super.onPageStarted(view, url, favicon); mProgressBar.setProgress(50); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); mProgressBar.setProgress(100); gone(mProgressBar); } @Override public void onLoadResource(WebView view, String url) { if (!url.startsWith("http") && !url.endsWith(md5File)) { String temp = url.substring("file://".length()); if (!temp.startsWith(extractPath)) { url = "file://" + extractPath + temp; } } super.onLoadResource(view, url); } @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { String url = request.getUrl().toString(); if (!url.startsWith("http") && !url.endsWith(md5File)) { String temp = url.substring("file://".length()); String insideFileName; if (!temp.startsWith(extractPath)) { url = "file://" + extractPath + temp; insideFileName = temp; } else { insideFileName = temp.substring(extractPath.length()); } if (insideFileName.contains("#")) { insideFileName = insideFileName.substring(0, insideFileName.indexOf("#")); } if (insideFileName.contains("?")) { insideFileName = insideFileName.substring(0, insideFileName.indexOf("?")); } if (insideFileName.contains("%20")) { insideFileName = insideFileName.replaceAll("%20", " "); } if (url.endsWith(".gif") || url.endsWith(".jpg") || url.endsWith(".png")) { try { return new WebResourceResponse("image/*", "", Utils.chm.getResourceAsStream(insideFileName)); } catch (IOException e) { e.printStackTrace(); return super.shouldInterceptRequest(view, request); } } else if (url.endsWith(".css") || url.endsWith(".js")) { try { return new WebResourceResponse("", "", Utils.chm.getResourceAsStream(insideFileName)); } catch (IOException e) { e.printStackTrace(); return super.shouldInterceptRequest(view, request); } } else { Utils.extractSpecificFile(chmFilePath, extractPath + insideFileName, insideFileName); } } Log.e("2, webviewrequest", url); return super.shouldInterceptRequest(view, request); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (!url.startsWith("http") && !url.endsWith(md5File)) { String temp = url.substring("file://".length()); if (!temp.startsWith(extractPath)) { url = "file://" + extractPath + temp; view.loadUrl(url); return true; } } return false; } public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { return shouldOverrideUrlLoading(view, request.getUrl().toString()); } }); mWebView.getSettings().setBuiltInZoomControls(true); mWebView.getSettings().setDisplayZoomControls(false); mWebView.getSettings().setUseWideViewPort(true); mWebView.getSettings().setLoadWithOverviewMode(true); mWebView.getSettings().setLoadsImagesAutomatically(true); } private void initFile() { new AsyncTask<Void, Void, Void>() { int historyIndex = 1; @Override protected void onPreExecute() { super.onPreExecute(); showDialog(); } @Override protected Void doInBackground(Void... voids) { md5File = Utils.checkSum(chmFilePath); extractPath = Constant.PATH_CHM + "/" + md5File; if (!(new File(extractPath).exists())) { if (Utils.extract(chmFilePath, extractPath)) { try { listSite = Utils.domparse(chmFilePath, extractPath, md5File); listBookmark = Utils.getBookmark(extractPath, md5File); } catch (IOException e) { e.printStackTrace(); } } else { (new File(extractPath)).delete(); } } else { listSite = Utils.getListSite(extractPath, md5File); listBookmark = Utils.getBookmark(extractPath, md5File); historyIndex = Utils.getHistory(extractPath, md5File); } return null; } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); mWebView.loadUrl("file://" + extractPath + "/" + listSite.get(historyIndex)); hideDialog(); } }.execute(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_chm_reader, menu); MenuItem searchMenuItem = menu.findItem(R.id.menu_search);//在菜单中找到对应控件的item SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem); searchView.setOnCloseListener(new SearchView.OnCloseListener() { @Override public boolean onClose() { mWebView.clearMatches(); return false; } }); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { return false; } @Override public boolean onQueryTextChange(String newText) { mWebView.findAllAsync(newText); try { for (Method m : WebView.class.getDeclaredMethods()) { if (m.getName().equals("setFindIsUp")) { m.setAccessible(true); m.invoke(mWebView, true); break; } } } catch (Exception ignored) { } return false; } }); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { return super.onOptionsItemSelected(item); } }