package com.dteviot.epubviewer;
import java.io.StringWriter;
import org.xml.sax.helpers.XMLFilterImpl;
import org.xmlpull.v1.XmlSerializer;
import com.dteviot.epubviewer.XmlFilter.InlineImageElementFilter;
import com.dteviot.epubviewer.XmlFilter.RemoveSvgElementFilter;
import com.dteviot.epubviewer.XmlFilter.StyleSheetElementFilter;
import com.dteviot.epubviewer.XmlFilter.XmlSerializerToXmlFilterAdapter;
import android.content.Context;
import android.net.Uri;
import android.util.AttributeSet;
import android.util.Log;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
/*
* EpubWebView for use with Android 2.3.
* The 2.3 web view can't handle links in HTML
* So we need to rebuild the HTML converting
* any links into in-line data
*/
public class EpubWebView23 extends EpubWebView {
public EpubWebView23(Context context) {
super(context);
}
public EpubWebView23(Context context, AttributeSet attrs) {
super(context, attrs);
}
/*
* Do any Web settings specific to the derived class
*/
protected void addWebSettings(WebSettings settings) {
// nothing to do
}
/*
* @ return Android version appropriate WebViewClient
*/
@Override
protected WebViewClient createWebViewClient() {
return new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
onPageLoaded();
}
};
}
/*
* Android 2.3 can't fetch linked resources in XHTML,
* so add use SAX pipeline to build new XHTML
* adding images as Data URIs and putting style sheets in-line
*/
@Override
protected void LoadUri(Uri uri) {
// default to a fail message
String xhtml =
"<html><head /><body>Failed to convert XHTML</body></html>";
try {
// build SAX pipeline to convert XHTML
// Chain is Reader -> stylesheetFilter -> imageFilter -> Serializer
XMLFilterImpl stylesheetFilter = new StyleSheetElementFilter(uri, getBook());
XMLFilterImpl svgFilter = new RemoveSvgElementFilter();
XMLFilterImpl imageFilter = new InlineImageElementFilter(uri, getBook());
svgFilter.setParent(stylesheetFilter);
imageFilter.setParent(svgFilter);
StringWriter writer = new StringWriter();
XmlSerializer serializer = android.util.Xml.newSerializer();
XmlSerializerToXmlFilterAdapter serializerFilter =
new XmlSerializerToXmlFilterAdapter(serializer);
serializerFilter.setParent(imageFilter);
// convert the XHTML
serializer.setOutput(writer);
XmlUtil.parseXmlResource(getBook().fetch(uri).getData(), stylesheetFilter,
serializerFilter);
xhtml = writer.toString();
} catch (Exception e) {
Log.e(Globals.TAG, "Error generating XML ", e);
// TODO construct error message HTML
}
// get WebView to show the XHTML
loadDataWithBaseURL(
uri.toString(),
xhtml,
"application/xhtml+xml",
"UTF-8",
null
);
}
}