diff options
-rw-r--r-- | android/src/com/artifex/mupdfdemo/MuPDFActivity.java | 169 | ||||
-rw-r--r-- | android/src/com/artifex/mupdfdemo/MuPDFReaderView.java | 183 |
2 files changed, 203 insertions, 149 deletions
diff --git a/android/src/com/artifex/mupdfdemo/MuPDFActivity.java b/android/src/com/artifex/mupdfdemo/MuPDFActivity.java index 03beff4b..3307087e 100644 --- a/android/src/com/artifex/mupdfdemo/MuPDFActivity.java +++ b/android/src/com/artifex/mupdfdemo/MuPDFActivity.java @@ -51,10 +51,9 @@ class ThreadPerTaskExecutor implements Executor { public class MuPDFActivity extends Activity { /* The core rendering instance */ - private static int tapPageMargin; private MuPDFCore core; private String mFileName; - private ReaderView mDocView; + private MuPDFReaderView mDocView; private View mButtonsView; private boolean mButtonsVisible; private EditText mPasswordView; @@ -80,7 +79,6 @@ public class MuPDFActivity extends Activity private SearchTask mSearchTask; private AlertDialog.Builder mAlertBuilder; private boolean mLinkHighlight = false; - private boolean mSelecting = false; private final Handler mHandler = new Handler(); private boolean mAlertsActive= false; private boolean mReflow = false; @@ -249,20 +247,6 @@ public class MuPDFActivity extends Activity { super.onCreate(savedInstanceState); - // Get the screen size etc to customise tap margins. - // We calculate the size of 1 inch of the screen for tapping. - // On some devices the dpi values returned are wrong, so we - // sanity check it: we first restrict it so that we are never - // less than 100 pixels (the smallest Android device screen - // dimension I've seen is 480 pixels or so). Then we check - // to ensure we are never more than 1/5 of the screen width. - DisplayMetrics dm = new DisplayMetrics(); - getWindowManager().getDefaultDisplay().getMetrics(dm); - tapPageMargin = (int)dm.xdpi; - if (tapPageMargin < 100) - tapPageMargin = 100; - if (tapPageMargin > dm.widthPixels/5) - tapPageMargin = dm.widthPixels/5; mAlertBuilder = new AlertDialog.Builder(this); @@ -386,144 +370,31 @@ public class MuPDFActivity extends Activity return; // Now create the UI. - // First create the document view making use of the ReaderView's internal - // gesture recognition - mDocView = new ReaderView(this) { - private boolean showButtonsDisabled; - - public boolean onSingleTapUp(MotionEvent e) { - LinkInfo link = null; - - if (!mSelecting && !showButtonsDisabled) { - MuPDFView pageView = (MuPDFView) mDocView.getDisplayedView(); - if (MuPDFCore.javascriptSupported() && pageView.passClickEvent(e.getX(), e.getY())) { - // If the page consumes the event do nothing else - } else if (mLinkHighlight && pageView != null && (link = pageView.hitLink(e.getX(), e.getY())) != null) { - link.acceptVisitor(new LinkInfoVisitor() { - @Override - public void visitInternal(LinkInfoInternal li) { - // Clicked on an internal (GoTo) link - mDocView.setDisplayedViewIndex(li.pageNumber); - } - - @Override - public void visitExternal(LinkInfoExternal li) { - Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(li.url)); - startActivity(intent); - } - - @Override - public void visitRemote(LinkInfoRemote li) { - // Clicked on a remote (GoToR) link - } - }); - } else if (e.getX() < tapPageMargin) { - super.smartMoveBackwards(); - } else if (e.getX() > super.getWidth()-tapPageMargin) { - super.smartMoveForwards(); - } else if (e.getY() < tapPageMargin) { - super.smartMoveBackwards(); - } else if (e.getY() > super.getHeight()-tapPageMargin) { - super.smartMoveForwards(); - } else if (!mButtonsVisible) { - showButtons(); - } else { - hideButtons(); - } - } - return super.onSingleTapUp(e); - } - - public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { - if (!mSelecting) { - if (!showButtonsDisabled) - hideButtons(); - - return super.onScroll(e1, e2, distanceX, distanceY); - } else { - MuPDFView pageView = (MuPDFView) mDocView.getDisplayedView(); - if (pageView != null) - pageView.selectText(e1.getX(), e1.getY(), e2.getX(), e2.getY()); - return true; - } - } - + // First create the document view + mDocView = new MuPDFReaderView(this) { @Override - public boolean onFling(MotionEvent e1, MotionEvent e2, - float velocityX, float velocityY) { - if (!mSelecting) - return super.onFling(e1, e2, velocityX, velocityY); - else - return true; - } - - public boolean onScaleBegin(ScaleGestureDetector d) { - // Disabled showing the buttons until next touch. - // Not sure why this is needed, but without it - // pinch zoom can make the buttons appear - showButtonsDisabled = true; - return super.onScaleBegin(d); - } - - public boolean onTouchEvent(MotionEvent event) { - if (event.getActionMasked() == MotionEvent.ACTION_DOWN) - showButtonsDisabled = false; - - return super.onTouchEvent(event); - } - - protected void onChildSetup(int i, View v) { - if (SearchTaskResult.get() != null && SearchTaskResult.get().pageNumber == i) - ((MuPDFView)v).setSearchBoxes(SearchTaskResult.get().searchBoxes); - else - ((MuPDFView)v).setSearchBoxes(null); - - ((MuPDFView)v).setLinkHighlighting(mLinkHighlight); - - ((MuPDFView)v).setChangeReporter(new Runnable() { - public void run() { - mDocView.applyToChildren(new ReaderView.ViewMapper() { - @Override - void applyToView(View view) { - ((MuPDFView)view).update(); - } - }); - } - }); - } - protected void onMoveToChild(int i) { if (core == null) return; - mPageNumberView.setText(String.format("%d / %d", i+1, core.countPages())); - mPageSlider.setMax((core.countPages()-1) * mPageSliderRes); + mPageNumberView.setText(String.format("%d / %d", i + 1, + core.countPages())); + mPageSlider.setMax((core.countPages() - 1) * mPageSliderRes); mPageSlider.setProgress(i * mPageSliderRes); - if (SearchTaskResult.get() != null && SearchTaskResult.get().pageNumber != i) { - SearchTaskResult.set(null); - mDocView.resetupChildren(); - } - } - - protected void onSettle(View v) { - // When the layout has settled ask the page to render - // in HQ - ((MuPDFView)v).addHq(false); - } - - protected void onUnsettle(View v) { - // When something changes making the previous settled view - // no longer appropriate, tell the page to remove HQ - ((MuPDFView)v).removeHq(); + super.onMoveToChild(i); } @Override - protected void onNotInUse(View v) { - ((MuPDFView)v).releaseResources(); + protected void onTapMainDocArea() { + if (!mButtonsVisible) { + showButtons(); + } else { + hideButtons(); + } } @Override - protected void onScaleChild(View v, Float scale) { - ((MuPDFView)v).setScale(scale); + protected void onDocMotion() { + hideButtons(); } }; mDocView.setAdapter(new MuPDFPageAdapter(this, core)); @@ -582,7 +453,7 @@ public class MuPDFActivity extends Activity // Activate the select button mSelectButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { - mSelecting = true; + mDocView.setSelectionMode(true); mTopBarSwitcher.setDisplayedChild(2); } }); @@ -592,7 +463,7 @@ public class MuPDFActivity extends Activity MuPDFView pageView = (MuPDFView) mDocView.getDisplayedView(); if (pageView != null) pageView.deselectText(); - mSelecting = false; + mDocView.setSelectionMode(false); mTopBarSwitcher.setDisplayedChild(0); } }); @@ -604,7 +475,7 @@ public class MuPDFActivity extends Activity boolean copied = false; if (pageView != null) copied = pageView.copySelection(); - mSelecting = false; + mDocView.setSelectionMode(false); mTopBarSwitcher.setDisplayedChild(0); mInfoView.setText(copied?"Copied to clipboard":"No text selected"); @@ -644,7 +515,7 @@ public class MuPDFActivity extends Activity MuPDFView pageView = (MuPDFView) mDocView.getDisplayedView(); if (pageView != null) pageView.strikeOutSelection(); - mSelecting = false; + mDocView.setSelectionMode(false); mTopBarSwitcher.setDisplayedChild(0); } }); @@ -728,7 +599,7 @@ public class MuPDFActivity extends Activity mLinkHighlight = true; } // Inform pages of the change. - mDocView.resetupChildren(); + mDocView.setLinksEnabled(mLinkHighlight); } }); diff --git a/android/src/com/artifex/mupdfdemo/MuPDFReaderView.java b/android/src/com/artifex/mupdfdemo/MuPDFReaderView.java new file mode 100644 index 00000000..7d0fb89b --- /dev/null +++ b/android/src/com/artifex/mupdfdemo/MuPDFReaderView.java @@ -0,0 +1,183 @@ +package com.artifex.mupdfdemo; + +import android.app.Activity; +import android.content.Context; +import android.content.Intent; +import android.net.Uri; +import android.util.DisplayMetrics; +import android.view.MotionEvent; +import android.view.ScaleGestureDetector; +import android.view.View; + +public class MuPDFReaderView extends ReaderView { + private final Context mContext; + private boolean mLinksEnabled = false; + private boolean mSelecting = false; + private boolean tapDisabled = false; + private int tapPageMargin; + + protected void onTapMainDocArea() {} + protected void onDocMotion() {} + + public void setLinksEnabled(boolean b) { + mLinksEnabled = b; + resetupChildren(); + } + + public void setSelectionMode(boolean b) { + mSelecting = b; + } + + public MuPDFReaderView(Activity act) { + super(act); + mContext = act; + // Get the screen size etc to customise tap margins. + // We calculate the size of 1 inch of the screen for tapping. + // On some devices the dpi values returned are wrong, so we + // sanity check it: we first restrict it so that we are never + // less than 100 pixels (the smallest Android device screen + // dimension I've seen is 480 pixels or so). Then we check + // to ensure we are never more than 1/5 of the screen width. + DisplayMetrics dm = new DisplayMetrics(); + act.getWindowManager().getDefaultDisplay().getMetrics(dm); + tapPageMargin = (int)dm.xdpi; + if (tapPageMargin < 100) + tapPageMargin = 100; + if (tapPageMargin > dm.widthPixels/5) + tapPageMargin = dm.widthPixels/5; + } + + public boolean onSingleTapUp(MotionEvent e) { + LinkInfo link = null; + + if (!mSelecting && !tapDisabled) { + MuPDFView pageView = (MuPDFView) getDisplayedView(); + if (MuPDFCore.javascriptSupported() + && pageView.passClickEvent(e.getX(), e.getY())) { + // If the page consumes the event do nothing else + } else if (mLinksEnabled && pageView != null + && (link = pageView.hitLink(e.getX(), e.getY())) != null) { + link.acceptVisitor(new LinkInfoVisitor() { + @Override + public void visitInternal(LinkInfoInternal li) { + // Clicked on an internal (GoTo) link + setDisplayedViewIndex(li.pageNumber); + } + + @Override + public void visitExternal(LinkInfoExternal li) { + Intent intent = new Intent(Intent.ACTION_VIEW, Uri + .parse(li.url)); + mContext.startActivity(intent); + } + + @Override + public void visitRemote(LinkInfoRemote li) { + // Clicked on a remote (GoToR) link + } + }); + } else if (e.getX() < tapPageMargin) { + super.smartMoveBackwards(); + } else if (e.getX() > super.getWidth() - tapPageMargin) { + super.smartMoveForwards(); + } else if (e.getY() < tapPageMargin) { + super.smartMoveBackwards(); + } else if (e.getY() > super.getHeight() - tapPageMargin) { + super.smartMoveForwards(); + } else { + onTapMainDocArea(); + } + } + return super.onSingleTapUp(e); + } + + public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, + float distanceY) { + if (!mSelecting) { + if (!tapDisabled) + onDocMotion(); + + return super.onScroll(e1, e2, distanceX, distanceY); + } else { + MuPDFView pageView = (MuPDFView)getDisplayedView(); + if (pageView != null) + pageView.selectText(e1.getX(), e1.getY(), e2.getX(), e2.getY()); + return true; + } + } + + @Override + public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, + float velocityY) { + if (!mSelecting) + return super.onFling(e1, e2, velocityX, velocityY); + else + return true; + } + + public boolean onScaleBegin(ScaleGestureDetector d) { + // Disabled showing the buttons until next touch. + // Not sure why this is needed, but without it + // pinch zoom can make the buttons appear + tapDisabled = true; + return super.onScaleBegin(d); + } + + public boolean onTouchEvent(MotionEvent event) { + if (event.getActionMasked() == MotionEvent.ACTION_DOWN) + tapDisabled = false; + + return super.onTouchEvent(event); + } + + protected void onChildSetup(int i, View v) { + if (SearchTaskResult.get() != null + && SearchTaskResult.get().pageNumber == i) + ((MuPDFView) v).setSearchBoxes(SearchTaskResult.get().searchBoxes); + else + ((MuPDFView) v).setSearchBoxes(null); + + ((MuPDFView) v).setLinkHighlighting(mLinksEnabled); + + ((MuPDFView) v).setChangeReporter(new Runnable() { + public void run() { + applyToChildren(new ReaderView.ViewMapper() { + @Override + void applyToView(View view) { + ((MuPDFView) view).update(); + } + }); + } + }); + } + + protected void onMoveToChild(int i) { + if (SearchTaskResult.get() != null + && SearchTaskResult.get().pageNumber != i) { + SearchTaskResult.set(null); + resetupChildren(); + } + } + + protected void onSettle(View v) { + // When the layout has settled ask the page to render + // in HQ + ((MuPDFView) v).addHq(false); + } + + protected void onUnsettle(View v) { + // When something changes making the previous settled view + // no longer appropriate, tell the page to remove HQ + ((MuPDFView) v).removeHq(); + } + + @Override + protected void onNotInUse(View v) { + ((MuPDFView) v).releaseResources(); + } + + @Override + protected void onScaleChild(View v, Float scale) { + ((MuPDFView) v).setScale(scale); + } +} |