summaryrefslogtreecommitdiff
path: root/platform/android
diff options
context:
space:
mode:
authorfred ross-perry <fredross-perry@Fred-Ross-Perrys-Computer.local>2016-08-14 20:01:39 -0700
committerfredross-perry <fross-perry@conceptuamath.com>2016-08-16 11:21:03 -0700
commit76cdf0cd380af6fe4eed6a260ce193be15dfee3a (patch)
treeb10f1ecf495604dfb9a6e4787074116c0da894ef /platform/android
parent07a60a0ef205eaf037135107085519616697f43e (diff)
downloadmupdf-76cdf0cd380af6fe4eed6a260ce193be15dfee3a.tar.xz
Android example - simple implementation of reflow.
page text (one page at a time) is converted to HTML and shown in a class that extends WebView.
Diffstat (limited to 'platform/android')
-rw-r--r--platform/android/example/mupdf/src/main/java/com/artifex/mupdf/android/DocActivityView.java90
-rw-r--r--platform/android/example/mupdf/src/main/java/com/artifex/mupdf/android/DocListPagesView.java30
-rwxr-xr-xplatform/android/example/mupdf/src/main/java/com/artifex/mupdf/android/DocPageView.java2
-rw-r--r--platform/android/example/mupdf/src/main/java/com/artifex/mupdf/android/DocReflowView.java103
-rw-r--r--platform/android/example/mupdf/src/main/res/drawable/icon_reflow.xml34
-rw-r--r--platform/android/example/mupdf/src/main/res/layout/doc_view.xml7
-rw-r--r--platform/android/example/mupdf/src/main/res/layout/pages_toolbar.xml6
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-->