diff options
7 files changed, 252 insertions, 20 deletions
diff --git a/platform/android/example/mupdf/src/main/java/com/artifex/mupdf/android/DocActivityView.java b/platform/android/example/mupdf/src/main/java/com/artifex/mupdf/android/DocActivityView.java index cad103a4..9c642059 100644 --- a/platform/android/example/mupdf/src/main/java/com/artifex/mupdf/android/DocActivityView.java +++ b/platform/android/example/mupdf/src/main/java/com/artifex/mupdf/android/DocActivityView.java @@ -10,6 +10,7 @@ import android.view.ViewTreeObserver; import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; import android.widget.FrameLayout; +import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TabHost; @@ -19,10 +20,12 @@ import com.artifex.mupdf.fitz.Link; import com.artifex.mupdf.fitz.Outline; import com.artifex.mupdf.fitz.R; -public class DocActivityView extends FrameLayout implements TabHost.OnTabChangeListener +public class DocActivityView extends FrameLayout implements TabHost.OnTabChangeListener, View.OnClickListener { private DocView mDocView; - private DocListPagesView mDocView2; + private DocReflowView mDocReflowView; + private DocListPagesView mDocPagesView; + private boolean mShowUI = true; // tab tags @@ -31,6 +34,8 @@ public class DocActivityView extends FrameLayout implements TabHost.OnTabChangeL private String mTagAnnotate; private String mTagPages; + ImageButton mReflowButton; + public DocActivityView(Context context) { super(context); @@ -115,7 +120,10 @@ public class DocActivityView extends FrameLayout implements TabHost.OnTabChangeL if (tabId.equals(mTagPages)) showPages(); else + { + hideReflow(); hidePages(); + } } protected void showPages() @@ -214,14 +222,29 @@ public class DocActivityView extends FrameLayout implements TabHost.OnTabChangeL { // main view mDocView = (DocView) findViewById(R.id.doc_view_inner); + mDocReflowView = (DocReflowView) findViewById(R.id.doc_reflow_view); // page list if (usePagesView()) { - mDocView2 = new DocListPagesView(getContext()); - mDocView2.setMainView(mDocView); + mDocPagesView = new DocListPagesView(getContext()); + mDocPagesView.setSelectionListener(new DocListPagesView.SelectionListener() + { + @Override + public void onPageSelected(int pageNumber) + { + mDocView.scrollToPage(pageNumber); + + if (mDocReflowView.getVisibility() == View.VISIBLE) + { + setReflowText(pageNumber); + mDocPagesView.setMostVisiblePage(pageNumber); + } + } + }); + LinearLayout layout2 = (LinearLayout) findViewById(R.id.pages_container); - layout2.addView(mDocView2); + layout2.addView(mDocPagesView); } // tabs @@ -242,19 +265,25 @@ public class DocActivityView extends FrameLayout implements TabHost.OnTabChangeL { if (usePagesView()) { - int mvp = mDocView.getMostVisiblePage(); - mDocView2.setMostVisiblePage(mvp); + if (mDocView.getVisibility() == View.VISIBLE) + { + int mvp = mDocView.getMostVisiblePage(); + mDocPagesView.setMostVisiblePage(mvp); + } } } }); // TODO: connect buttons to functions + mReflowButton = (ImageButton)findViewById(R.id.reflow_button); + mReflowButton.setOnClickListener(this); + // start the views mDocView.start(path); if (usePagesView()) { - mDocView2.clone(mDocView); + mDocPagesView.clone(mDocView); } } @@ -268,7 +297,7 @@ public class DocActivityView extends FrameLayout implements TabHost.OnTabChangeL mDocView.finish(); if (usePagesView()) { - mDocView2.finish(); + mDocPagesView.finish(); } } @@ -322,4 +351,47 @@ public class DocActivityView extends FrameLayout implements TabHost.OnTabChangeL } } + + @Override + public void onClick(View v) + { + if (v == mReflowButton) + onReflowButton(); + } + + private void onReflowButton() + { + if (mDocView.getVisibility() == View.VISIBLE) + { + // set initial text into reflow view + setReflowText(mDocPagesView.getMostVisiblePage()); + + // show reflow + showReflow(); + } + else + { + // hide reflow + hideReflow(); + } + } + + private void showReflow() + { + mDocView.setVisibility(View.GONE); + mDocReflowView.setVisibility(View.VISIBLE); + } + + private void hideReflow() + { + mDocReflowView.setVisibility(View.GONE); + mDocView.setVisibility(View.VISIBLE); + } + + private void setReflowText(int pageNumber) + { + DocPageView dpv = (DocPageView)mDocView.getAdapter().getView(pageNumber, null, null); + byte bytes[] = dpv.getPage().textAsHtml(); + mDocReflowView.setHTML(bytes); + } } diff --git a/platform/android/example/mupdf/src/main/java/com/artifex/mupdf/android/DocListPagesView.java b/platform/android/example/mupdf/src/main/java/com/artifex/mupdf/android/DocListPagesView.java index 8ee1fb5e..533633b5 100644 --- a/platform/android/example/mupdf/src/main/java/com/artifex/mupdf/android/DocListPagesView.java +++ b/platform/android/example/mupdf/src/main/java/com/artifex/mupdf/android/DocListPagesView.java @@ -8,8 +8,7 @@ import android.view.ScaleGestureDetector; public class DocListPagesView extends DocViewBase { - - private DocViewBase mMainView; + private SelectionListener mSelectionListener = null; public DocListPagesView(Context context) { @@ -26,11 +25,6 @@ public class DocListPagesView extends DocViewBase super(context, attrs, defStyle); } - public void setMainView(DocViewBase v) - { - mMainView = v; - } - @Override protected void doSingleTap(float fx, float fy) { @@ -39,7 +33,9 @@ public class DocListPagesView extends DocViewBase if (v != null) { int pageNumber = v.getPageNumber(); - mMainView.scrollToPage(pageNumber); + + if (mSelectionListener != null) + mSelectionListener.onPageSelected(pageNumber); } } @@ -94,6 +90,18 @@ public class DocListPagesView extends DocViewBase } } + public int getMostVisiblePage() + { + int numPages = getPageCount(); + for (int i = 0; i < numPages; i++) + { + DocPageView cv = (DocPageView) getOrCreateChild(i); + if (cv.getMostVisible()) + return i; + } + return 0; + } + @Override public void onShowPages() { @@ -104,4 +112,10 @@ public class DocListPagesView extends DocViewBase { } + public interface SelectionListener + { + void onPageSelected(int pageNumber); + } + + public void setSelectionListener(SelectionListener l) {mSelectionListener=l;} } diff --git a/platform/android/example/mupdf/src/main/java/com/artifex/mupdf/android/DocPageView.java b/platform/android/example/mupdf/src/main/java/com/artifex/mupdf/android/DocPageView.java index 536488f1..5b93e7d2 100755 --- a/platform/android/example/mupdf/src/main/java/com/artifex/mupdf/android/DocPageView.java +++ b/platform/android/example/mupdf/src/main/java/com/artifex/mupdf/android/DocPageView.java @@ -697,6 +697,8 @@ public class DocPageView extends View implements Callback } } + public boolean getMostVisible() {return isMostVisible;} + public void setMostVisible(boolean val) { boolean wasMostVisible = isMostVisible; diff --git a/platform/android/example/mupdf/src/main/java/com/artifex/mupdf/android/DocReflowView.java b/platform/android/example/mupdf/src/main/java/com/artifex/mupdf/android/DocReflowView.java new file mode 100644 index 00000000..c5a2c2b4 --- /dev/null +++ b/platform/android/example/mupdf/src/main/java/com/artifex/mupdf/android/DocReflowView.java @@ -0,0 +1,103 @@ +package com.artifex.mupdf.android; + +import android.content.Context; +import android.os.Build; +import android.util.AttributeSet; +import android.util.Base64; +import android.view.MotionEvent; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +public class DocReflowView extends WebView +{ + private float mScale; + private float mStartScale; + + public DocReflowView(Context context) + { + super(context); + initialize(context); + } + + public DocReflowView(Context context, AttributeSet attrs) + { + super(context, attrs); + initialize(context); + } + + public DocReflowView(Context context, AttributeSet attrs, int defStyle) + { + super(context, attrs, defStyle); + initialize(context); + } + + private void initialize(Context context) + { + getSettings().setJavaScriptEnabled(true); + getSettings().setBuiltInZoomControls(true); + getSettings().setDisplayZoomControls(false); + getSettings().setUseWideViewPort(true); + + mScale = getResources().getDisplayMetrics().density; + + setWebViewClient(new MyWebViewClient()); + } + + public void setHTML(byte bytes[]) + { + // preserve zoom level between pages + + int zoom = (int)(100 * mScale); + + String b64 = Base64.encodeToString(bytes, Base64.DEFAULT); + loadData(b64, "text/html; charset=utf-8", "base64"); + + setInitialScale(zoom); + scrollTo(0, 0); + } + + private void doJavaScript(String javaScript) + { + if (Build.VERSION.SDK_INT >= 19) + { + evaluateJavascript(javaScript, null); + } + else + { + loadUrl("javascript:" + javaScript); + } + } + + @Override + public boolean onTouchEvent(MotionEvent event) + { + if ((event.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_DOWN) + { + // do something when user interaction begins + mStartScale = mScale; + } + + if ((event.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_UP) + { + // do something when user interaction ends + if (mScale != mStartScale) + { + scrollTo(0, getScrollY()); + doJavaScript("document.getElementById('content').style.width = window.innerWidth;"); + } + mStartScale = mScale; + } + + return super.onTouchEvent(event); + } + + public class MyWebViewClient extends WebViewClient + { + @Override + public void onScaleChanged(final WebView webView, float oldScale, float newScale) + { + mScale = newScale; + } + } + +} diff --git a/platform/android/example/mupdf/src/main/res/drawable/icon_reflow.xml b/platform/android/example/mupdf/src/main/res/drawable/icon_reflow.xml new file mode 100644 index 00000000..fee3f0c5 --- /dev/null +++ b/platform/android/example/mupdf/src/main/res/drawable/icon_reflow.xml @@ -0,0 +1,34 @@ +<?xml version="1.0" encoding="utf-8"?> +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="50dp" + android:height="50dp" + android:viewportWidth="50" + android:viewportHeight="50"> + + <path + android:strokeColor="#333333" + android:strokeWidth="1.171" + android:pathData="M16.181,19.879 L34.026,19.879" /> + <path + android:strokeColor="#333333" + android:strokeWidth="1.171" + android:pathData="M16.181,24.803 L34.026,24.803" /> + <path + android:strokeColor="#333333" + android:strokeWidth="1.171" + android:pathData="M16.183,29.727 L25.848,29.727" /> + <path + android:fillColor="#333333" + android:pathData="M37.641,40.245 L12.36,40.245 L12.36,9.755 L37.641,9.755 L37.641,40.245 Z +M38.817,8.579 L11.182,8.579 L11.182,41.422 L38.817,41.422 L38.817,8.579 Z" /> + <path + android:strokeColor="#333333" + android:strokeWidth="1.171" + android:pathData="M26.737,29.727 L31.35,29.727 C32.332,29.727,33.13,30.524,33.13,31.506 +L33.13,31.717 C33.13,32.699,32.332,33.492,31.35,33.492 L26.731,33.492" /> + <path + android:strokeColor="#333333" + android:strokeWidth="0.886" + android:strokeMiterLimit="10" + android:pathData="M28.904,35.771 L26.438,33.506 L28.891,31.232" /> +</vector>
\ No newline at end of file diff --git a/platform/android/example/mupdf/src/main/res/layout/doc_view.xml b/platform/android/example/mupdf/src/main/res/layout/doc_view.xml index f1fab51e..dec1313f 100644 --- a/platform/android/example/mupdf/src/main/res/layout/doc_view.xml +++ b/platform/android/example/mupdf/src/main/res/layout/doc_view.xml @@ -165,6 +165,13 @@ android:layout_height="match_parent"> </com.artifex.mupdf.android.DocView> + <com.artifex.mupdf.android.DocReflowView + android:id="@+id/doc_reflow_view" + android:visibility="gone" + android:layout_width="match_parent" + android:layout_height="match_parent"> + </com.artifex.mupdf.android.DocReflowView> + </RelativeLayout> </LinearLayout> diff --git a/platform/android/example/mupdf/src/main/res/layout/pages_toolbar.xml b/platform/android/example/mupdf/src/main/res/layout/pages_toolbar.xml index e0d8ecb4..f5cbc4d6 100644 --- a/platform/android/example/mupdf/src/main/res/layout/pages_toolbar.xml +++ b/platform/android/example/mupdf/src/main/res/layout/pages_toolbar.xml @@ -26,8 +26,8 @@ android:scaleType="fitXY" android:layout_centerVertical="true" android:background="@drawable/toolbar_button" - android:id="@+id/save_button" - android:src="@drawable/icon_save" /> + android:id="@+id/reflow_button" + android:src="@drawable/icon_reflow" /> <TextView android:layout_width="match_parent" @@ -35,7 +35,7 @@ android:gravity="center" android:textColor="@color/black" android:textSize="11sp" - android:text="SAVE"/> + android:text="REFLOW"/> </LinearLayout> <!--a divider--> |