diff --git a/android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/DecodingAsyncTask.java b/android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/DecodingAsyncTask.java index 24292ac9..6e5cdb8d 100644 --- a/android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/DecodingAsyncTask.java +++ b/android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/DecodingAsyncTask.java @@ -52,8 +52,8 @@ protected Throwable doInBackground(Void... params) { if (pdfView != null) { PdfDocument pdfDocument = docSource.createDocument(pdfView.getContext(), pdfiumCore, password); pdfFile = new PdfFile(pdfiumCore, pdfDocument, pdfView.getPageFitPolicy(), getViewSize(pdfView), - userPages, pdfView.isSwipeVertical(), pdfView.getSpacingPx(), pdfView.isAutoSpacingEnabled(), - pdfView.isFitEachPage()); + userPages, pdfView.isOnDualPageMode(), pdfView.isSwipeVertical(), pdfView.getSpacingPx(), pdfView.isAutoSpacingEnabled(), + pdfView.isFitEachPage(), pdfView.isOnLandscapeOrientation()); return null; } else { return new NullPointerException("pdfView == null"); diff --git a/android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/PDFView.java b/android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/PDFView.java index 2d8aa955..356513a8 100644 --- a/android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/PDFView.java +++ b/android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/PDFView.java @@ -202,9 +202,17 @@ enum ScrollDir { private int defaultPage = 0; +<<<<<<< HEAD /** * True if should scroll through pages vertically instead of horizontally */ +======= + private boolean dualPageMode = false; + + private boolean isLandscapeOrientation = false; + + /** True if should scroll through pages vertically instead of horizontally */ +>>>>>>> 34884282f7465aca016a3fa9a06618b9116cb8e1 private boolean swipeVertical = true; private boolean enableSwipe = true; @@ -1236,6 +1244,18 @@ public boolean isBestQuality() { return bestQuality; } + public boolean isOnDualPageMode() { + return dualPageMode; + } + + public boolean isOnLandscapeOrientation() { return isLandscapeOrientation; } + + public void setLandscapeOrientation(boolean landscapeOrientation) {this.isLandscapeOrientation = landscapeOrientation; } + + public void setDualPageMode(boolean dualPageMode) { + this.dualPageMode = dualPageMode; + } + public boolean isSwipeVertical() { return swipeVertical; } @@ -1428,6 +1448,10 @@ public class Configurator { private int defaultPage = 0; + private boolean landscapeOrientation = false; + + private boolean dualPageMode = false; + private boolean swipeHorizontal = false; private boolean annotationRendering = false; @@ -1536,6 +1560,16 @@ public Configurator defaultPage(int defaultPage) { return this; } + public Configurator landscapeOrientation(boolean landscapeOrientation) { + this.landscapeOrientation = landscapeOrientation; + return this; + } + + public Configurator dualPageMode(boolean dualPageMode) { + this.dualPageMode = dualPageMode; + return this; + } + public Configurator swipeHorizontal(boolean swipeHorizontal) { this.swipeHorizontal = swipeHorizontal; return this; @@ -1617,6 +1651,8 @@ public void load() { PDFView.this.setNightMode(nightMode); PDFView.this.enableDoubletap(enableDoubletap); PDFView.this.setDefaultPage(defaultPage); + PDFView.this.setLandscapeOrientation(landscapeOrientation); + PDFView.this.setDualPageMode(dualPageMode); PDFView.this.setSwipeVertical(!swipeHorizontal); PDFView.this.enableAnnotationRendering(annotationRendering); PDFView.this.setScrollHandle(scrollHandle); diff --git a/android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/PdfFile.java b/android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/PdfFile.java index fdc104f2..3610bcbb 100644 --- a/android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/PdfFile.java +++ b/android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/PdfFile.java @@ -51,6 +51,8 @@ class PdfFile { private SizeF maxHeightPageSize = new SizeF(0, 0); /** Scaled page with maximum width */ private SizeF maxWidthPageSize = new SizeF(0, 0); + /** True if dualPageMode is on*/ + private boolean showTwoPages; /** True if scrolling is vertical, else it's horizontal */ private boolean isVertical; /** Fixed spacing between pages in pixels */ @@ -69,6 +71,8 @@ class PdfFile { * else the largest page fits and other pages scale relatively */ private final boolean fitEachPage; + + private final boolean isLandscape; /** * The pages the user want to display in order * (ex: 0, 2, 2, 8, 8, 1, 1, 1) @@ -76,7 +80,8 @@ class PdfFile { private int[] originalUserPages; PdfFile(PdfiumCore pdfiumCore, PdfDocument pdfDocument, FitPolicy pageFitPolicy, Size viewSize, int[] originalUserPages, - boolean isVertical, int spacing, boolean autoSpacing, boolean fitEachPage) { + boolean showTwoPages, boolean isVertical, int spacing, boolean autoSpacing, boolean fitEachPage, boolean isLandscape) { + this.showTwoPages = showTwoPages; this.pdfiumCore = pdfiumCore; this.pdfDocument = pdfDocument; this.pageFitPolicy = pageFitPolicy; @@ -85,6 +90,7 @@ class PdfFile { this.spacingPx = spacing; this.autoSpacing = autoSpacing; this.fitEachPage = fitEachPage; + this.isLandscape = isLandscape; setup(viewSize); } @@ -122,7 +128,7 @@ public void recalculatePageSizes(Size viewSize) { maxHeightPageSize = calculator.getOptimalMaxHeightPageSize(); for (Size size : originalPageSizes) { - pageSizes.add(calculator.calculate(size)); + pageSizes.add(calculator.calculate(size, showTwoPages, isLandscape)); } if (autoSpacing) { prepareAutoSpacing(viewSize); diff --git a/android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/scroll/DefaultScrollHandle.java b/android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/scroll/DefaultScrollHandle.java index aa9206b4..3ae1f472 100644 --- a/android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/scroll/DefaultScrollHandle.java +++ b/android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/scroll/DefaultScrollHandle.java @@ -149,7 +149,11 @@ private void calculateMiddle() { pos = getY(); viewSize = getHeight(); pdfViewSize = pdfView.getHeight(); - } else { + } else if (pdfView.isOnDualPageMode()){ + pos = getX(); + viewSize = getWidth() / 2; + pdfViewSize = pdfView.getWidth() / 2; + } else { pos = getX(); viewSize = getWidth(); pdfViewSize = pdfView.getWidth(); diff --git a/android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/util/PageSizeCalculator.java b/android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/util/PageSizeCalculator.java index 4d678c98..e7f35a3b 100644 --- a/android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/util/PageSizeCalculator.java +++ b/android-pdf-viewer/src/main/java/com/github/barteksc/pdfviewer/util/PageSizeCalculator.java @@ -15,6 +15,9 @@ */ package com.github.barteksc.pdfviewer.util; +import android.app.Activity; +import android.util.Log; +import android.content.pm.ActivityInfo; import com.shockwave.pdfium.util.Size; import com.shockwave.pdfium.util.SizeF; @@ -40,11 +43,16 @@ public PageSizeCalculator(FitPolicy fitPolicy, Size originalMaxWidthPageSize, Si calculateMaxPages(); } - public SizeF calculate(Size pageSize) { + public SizeF calculate(Size pageSize, boolean showTwoPages, boolean isLandscape) { if (pageSize.getWidth() <= 0 || pageSize.getHeight() <= 0) { return new SizeF(0, 0); } - float maxWidth = fitEachPage ? viewSize.getWidth() : pageSize.getWidth() * widthRatio; + float maxWidth = 0; + if(showTwoPages && !isLandscape){ + maxWidth = fitEachPage ? viewSize.getWidth() : pageSize.getWidth() / 2 * widthRatio; + } else { + maxWidth = fitEachPage ? viewSize.getWidth() : pageSize.getWidth() * widthRatio; + } float maxHeight = fitEachPage ? viewSize.getHeight() : pageSize.getHeight() * heightRatio; switch (fitPolicy) { case HEIGHT: diff --git a/sample/src/main/java/com/github/barteksc/sample/PDFViewActivity.java b/sample/src/main/java/com/github/barteksc/sample/PDFViewActivity.java index 1a9ec7ea..040ff57a 100755 --- a/sample/src/main/java/com/github/barteksc/sample/PDFViewActivity.java +++ b/sample/src/main/java/com/github/barteksc/sample/PDFViewActivity.java @@ -18,6 +18,7 @@ import android.content.ActivityNotFoundException; import android.content.Intent; import android.content.pm.PackageManager; +import android.content.res.Configuration; import android.database.Cursor; import android.graphics.Color; import android.net.Uri; @@ -71,6 +72,8 @@ public class PDFViewActivity extends AppCompatActivity implements OnPageChangeLi String pdfFileName; + + @OptionsItem(R.id.pickFile) void pickFile() { int permissionCheck = ContextCompat.checkSelfPermission(this, @@ -112,6 +115,9 @@ void afterViews() { } private void displayFromAsset(String assetFileName) { + boolean isLandscape = false; + int orientation = this.getResources().getConfiguration().orientation; + isLandscape = orientation == Configuration.ORIENTATION_LANDSCAPE; pdfFileName = assetFileName; pdfView.fromAsset(SAMPLE_FILE) @@ -119,8 +125,14 @@ private void displayFromAsset(String assetFileName) { .onPageChange(this) .enableAnnotationRendering(true) .onLoad(this) + .landscapeOrientation(isLandscape) + .dualPageMode(true) .scrollHandle(new DefaultScrollHandle(this)) - .spacing(10) // in dp + .spacing(0) // in dp + .enableSwipe(true) + .swipeHorizontal(true) + .pageFling(true) + .fitEachPage(false) .onPageError(this) .pageFitPolicy(FitPolicy.BOTH) .load(); @@ -135,7 +147,11 @@ private void displayFromUri(Uri uri) { .enableAnnotationRendering(true) .onLoad(this) .scrollHandle(new DefaultScrollHandle(this)) - .spacing(10) // in dp + .spacing(0) // in dp + .dualPageMode(true) + .enableSwipe(true) + .swipeHorizontal(true) + .pageFling(true) .onPageError(this) .load(); }