{
@Override
protected void onPreExecute() {
NewsDetailActivity ndActivity = ((NewsDetailActivity)getActivity());
if(background_color != Integer.MIN_VALUE && ThemeChooser.isDarkTheme(ndActivity))
{
mWebView.setBackgroundColor(background_color);
ndActivity.mViewPager.setBackgroundColor(background_color);
}
init_webView();
mWebView.setVisibility(View.GONE);
mProgressBarLoading.setVisibility(View.VISIBLE);
super.onPreExecute();
}
@Override
protected String doInBackground(Void... voids) {
NewsDetailActivity ndActivity = ((NewsDetailActivity)getActivity());
RssItem rssItem = ndActivity.rssItems.get(section_number);
return getHtmlPage(ndActivity, rssItem, true);
}
@Override
protected void onPostExecute(String htmlPage) {
mWebView.setVisibility(View.VISIBLE);
mProgressBarLoading.setVisibility(View.GONE);
SetSoftwareRenderModeForWebView(htmlPage, mWebView);
html = htmlPage;
mWebView.loadDataWithBaseURL("file:///android_asset/", htmlPage, "text/html", "UTF-8", "");
super.onPostExecute(htmlPage);
}
}
/**
* This function has no effect on devices with api level < HONEYCOMB
* @param htmlPage
* @param webView
*/
public static void SetSoftwareRenderModeForWebView(String htmlPage, WebView webView) {
if (htmlPage.contains(".gif")) {
webView.setLayerType(WebView.LAYER_TYPE_SOFTWARE, null);
Log.v("NewsDetailFragment", "Using LAYER_TYPE_SOFTWARE");
} else {
//webView.setLayerType(WebView.LAYER_TYPE_HARDWARE, null);
//Log.v("NewsDetailFragment", "Using LAYER_TYPE_HARDWARE");
if(webView.getLayerType() == WebView.LAYER_TYPE_HARDWARE) {
Log.v("NewsDetailFragment", "Using LAYER_TYPE_HARDWARE");
} else if (webView.getLayerType() == WebView.LAYER_TYPE_SOFTWARE){
Log.v("NewsDetailFragment", "Using LAYER_TYPE_SOFTWARE");
} else {
Log.v("NewsDetailFragment", "Using LAYER_TYPE_DEFAULT");
}
}
}
boolean changedUrl = false;
@SuppressLint("SetJavaScriptEnabled")
private void init_webView() {
int backgroundColor = ColorHelper.getColorFromAttribute(getContext(),
R.attr.news_detail_background_color);
mWebView.setBackgroundColor(backgroundColor);
WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setAllowFileAccess(true);
webSettings.setDomStorageEnabled(true);
webSettings.setJavaScriptCanOpenWindowsAutomatically(false);
webSettings.setSupportMultipleWindows(false);
webSettings.setSupportZoom(false);
webSettings.setAppCacheEnabled(true);
registerForContextMenu(mWebView);
mWebView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onConsoleMessage(ConsoleMessage cm) {
Log.v(TAG, cm.message() + " at " + cm.sourceId() + ":" + cm.lineNumber());
return true;
}
@Override
public void onProgressChanged(WebView view, int progress) {
if (progress < 100 && mProgressbarWebView.getVisibility() == ProgressBar.GONE) {
mProgressbarWebView.setVisibility(ProgressBar.VISIBLE);
}
mProgressbarWebView.setProgress(progress);
if (progress == 100) {
mProgressbarWebView.setVisibility(ProgressBar.GONE);
//The following three lines are a workaround for websites which don't use a background color
int bgColor = ContextCompat.getColor(getContext(), R.color.slider_listview_text_color_dark_theme);
NewsDetailActivity ndActivity = ((NewsDetailActivity) getActivity());
mWebView.setBackgroundColor(bgColor);
ndActivity.mViewPager.setBackgroundColor(bgColor);
if (ThemeChooser.isDarkTheme(getActivity())) {
mWebView.setBackgroundColor(ContextCompat.getColor(getContext(), android.R.color.transparent));
}
}
}
});
mWebView.setWebViewClient(new WebViewClient() {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
if (changedUrl) {
changedUrl = false;
if (!url.equals("file:///android_asset/") && (urls.isEmpty() || !urls.get(0).equals(url))) {
urls.add(0, url);
Log.v(TAG, "Page finished (added): " + url);
}
}
super.onPageStarted(view, url, favicon);
}
});
mWebView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (v.getId() == R.id.webview && event.getAction() == MotionEvent.ACTION_DOWN) {
changedUrl = true;
}
return false;
}
});
}
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
if (v instanceof WebView) {
WebView.HitTestResult result = ((WebView) v).getHitTestResult();
if (result != null) {
int type = result.getType();
Document htmldoc = Jsoup.parse(html);
FragmentTransaction ft = getFragmentManager().beginTransaction();
if (type == WebView.HitTestResult.IMAGE_TYPE || type == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
String imageUrl = result.getExtra();
if (imageUrl.startsWith("http") || imageUrl.startsWith("file")) {
URL mImageUrl;
String imgtitle;
String imgaltval;
String imgsrcval;
imgsrcval = imageUrl.substring(imageUrl.lastIndexOf('/') + 1, imageUrl.length());
Elements imgtag = htmldoc.getElementsByAttributeValueContaining("src", imageUrl);
try {
imgtitle = imgtag.first().attr("title");
} catch (NullPointerException e) {
imgtitle = "";
}
try {
imgaltval = imgtag.first().attr("alt");
} catch (NullPointerException e) {
imgaltval = "";
}
try {
mImageUrl = new URL(imageUrl);
} catch (MalformedURLException e) {
return;
}
String title = imgsrcval;
int titleIcon = android.R.drawable.ic_menu_gallery;
String text = (imgtitle.isEmpty()) ? imgaltval : imgtitle;
// Create and show the dialog.
DialogFragment newFragment =
NewsDetailImageDialogFragment.newInstanceImage(title, titleIcon, text, mImageUrl);
newFragment.show(ft, "menu_fragment_dialog");
}
}
else if (type == WebView.HitTestResult.SRC_ANCHOR_TYPE) {
String url = result.getExtra();
URL mUrl;
String text;
try {
Elements urltag = htmldoc.getElementsByAttributeValueContaining("href", url);
text = urltag.text();
mUrl = new URL(url);
} catch (MalformedURLException e) {
return;
}
// Create and show the dialog.
DialogFragment newFragment =
NewsDetailImageDialogFragment.newInstanceUrl(text, mUrl.toString());
newFragment.show(ft, "menu_fragment_dialog");
}
//else if (type == WebView.HitTestResult.EMAIL_TYPE) { }
//else if (type == WebView.HitTestResult.GEO_TYPE) { }
//else if (type == WebView.HitTestResult.PHONE_TYPE) { }
//else if (type == WebView.HitTestResult.EDIT_TEXT_TYPE) { }
}
}
}
@SuppressLint("SimpleDateFormat")
public static String getHtmlPage(Context context, RssItem rssItem, boolean showHeader)
{
String feedTitle = "Undefined";
String favIconUrl = null;
Feed feed = rssItem.getFeed();
int[] colors = ColorHelper.getColorsFromAttributes(context,
R.attr.dividerLineColor,
R.attr.rssItemListBackground);
int feedColor = colors[0];
if(feed != null) {
feedTitle = StringEscapeUtils.escapeHtml4(feed.getFeedTitle());
favIconUrl = feed.getFaviconUrl();
if(feed.getAvgColour() != null)
feedColor = Integer.parseInt(feed.getAvgColour());
}
if(favIconUrl != null)
{
DiskCache diskCache = ImageLoader.getInstance().getDiskCache();
File file = diskCache.get(favIconUrl);
if(file != null)
favIconUrl = "file://" + file.getAbsolutePath();
} else {
favIconUrl = "file:///android_res/drawable/default_feed_icon_light.png";
}
String body_id;
if(ThemeChooser.isDarkTheme(context)) {
body_id = "darkTheme";
} else {
body_id = "lightTheme";
}
boolean isRightToLeft = context.getResources().getBoolean(R.bool.is_right_to_left);
String rtlClass = isRightToLeft ? "rtl" : "";
String borderSide = isRightToLeft ? "right" : "left";
StringBuilder builder = new StringBuilder();
builder.append("");
builder.append("");
builder.append("");
builder.append(String.format("", body_id, rtlClass));
if(showHeader) {
builder.append("");
builder.append("");
String authorOfArticle = StringEscapeUtils.escapeHtml4(rssItem.getAuthor());
if (authorOfArticle != null)
if (!authorOfArticle.trim().equals(""))
feedTitle += " - " + authorOfArticle.trim();
builder.append("");
builder.append("
");
}
String description = rssItem.getBody();
description = getDescriptionWithCachedImages(description).trim();
//StopWatch stopWatch = new StopWatch();
// stopWatch.start();
description = removePreloadAttributeFromVideos(description);
//stopWatch.stop();
//Log.d("NewsDetailFragment", "Time needed for removing preload attribute: " + stopWatch.toString() + " - " + feedTitle);
builder.append("");
builder.append(description);
builder.append("
");
builder.append("");
String htmlData = builder.toString().replaceAll("\"//", "\"https://");
return htmlData;
}
private static Pattern PATTERN_PRELOAD_VIDEOS = Pattern.compile("(