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);
}
}