1 package cz.cvut.fel.dce.qrscanner.mupdf;
3 import android.content.Context;
4 import android.graphics.Point;
5 import android.graphics.PointF;
6 import android.graphics.RectF;
7 import android.os.Handler;
8 import android.util.Base64;
9 import android.view.MotionEvent;
10 import android.view.View;
11 import android.webkit.WebView;
12 import android.webkit.WebViewClient;
14 public class MuPDFReflowView extends WebView implements MuPDFView {
15 private final MuPDFCore mCore;
16 private final Handler mHandler;
17 private final Point mParentSize;
20 private int mContentHeight;
21 AsyncTask<Void,Void,byte[]> mLoadHTML;
23 public MuPDFReflowView(Context c, MuPDFCore core, Point parentSize) {
25 mHandler = new Handler();
27 mParentSize = parentSize;
29 mContentHeight = parentSize.y;
30 getSettings().setJavaScriptEnabled(true);
31 addJavascriptInterface(new Object(){
32 public void reportContentHeight(String value) {
33 mContentHeight = (int)Float.parseFloat(value);
34 mHandler.post(new Runnable() {
41 setWebViewClient(new WebViewClient() {
43 public void onPageFinished(WebView view, String url) {
49 private void requestHeight() {
50 // Get the webview to report the content height via the interface setup
51 // above. Workaround for getContentHeight not working
52 loadUrl("javascript:elem=document.getElementById('content');window.HTMLOUT.reportContentHeight("+mParentSize.x+"*elem.offsetHeight/elem.offsetWidth)");
55 public void setPage(int page, PointF size) {
57 if (mLoadHTML != null) {
58 mLoadHTML.cancel(true);
60 mLoadHTML = new AsyncTask<Void,Void,byte[]>() {
62 protected byte[] doInBackground(Void... params) {
63 return mCore.html(mPage);
66 protected void onPostExecute(byte[] result) {
67 String b64 = Base64.encodeToString(result, Base64.DEFAULT);
68 loadData(b64, "text/html; charset=utf-8", "base64");
74 public int getPage() {
78 public void setScale(float scale) {
80 loadUrl("javascript:document.getElementById('content').style.zoom=\""+(int)(mScale*100)+"%\"");
84 public void blank(int page) {
87 public Hit passClickEvent(float x, float y) {
91 public LinkInfo hitLink(float x, float y) {
95 public void selectText(float x0, float y0, float x1, float y1) {
98 public void deselectText() {
101 public boolean copySelection() {
105 public boolean markupSelection(Annotation.Type type) {
109 public void startDraw(float x, float y) {
112 public void continueDraw(float x, float y) {
115 public void cancelDraw() {
118 public boolean saveDraw() {
122 public void setSearchBoxes(RectF[] searchBoxes) {
125 public void setLinkHighlighting(boolean f) {
128 public void deleteSelectedAnnotation() {
131 public void deselectAnnotation() {
134 public void setChangeReporter(Runnable reporter) {
137 public void update() {
140 public void updateHq(boolean update) {
143 public void removeHq() {
146 public void releaseResources() {
147 if (mLoadHTML != null) {
148 mLoadHTML.cancel(true);
153 public void releaseBitmaps() {
157 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
159 switch(View.MeasureSpec.getMode(widthMeasureSpec)) {
160 case View.MeasureSpec.UNSPECIFIED:
164 x = View.MeasureSpec.getSize(widthMeasureSpec);
166 switch(View.MeasureSpec.getMode(heightMeasureSpec)) {
167 case View.MeasureSpec.UNSPECIFIED:
171 y = View.MeasureSpec.getSize(heightMeasureSpec);
174 setMeasuredDimension(x, y);
178 public boolean onTouchEvent(MotionEvent ev) {
179 // TODO Auto-generated method stub