diff --git a/app/src/main/assets/viewer.js b/app/src/main/assets/viewer.js index d055081..2dd5e60 100644 --- a/app/src/main/assets/viewer.js +++ b/app/src/main/assets/viewer.js @@ -5,6 +5,7 @@ let pageRendering = false; let renderPending = false; let renderPendingLazy = false; const canvas = document.getElementById('content'); +let orientationDegrees = 0; let zoomLevel = 100; let textLayerDiv = document.getElementById("text"); const zoomLevels = [50, 75, 100, 125, 150]; @@ -63,10 +64,13 @@ function renderPage(pageNumber, lazy, prerender, prerenderTrigger=0) { newPageNumber = pageNumber; newZoomLevel = zoomLevels[channel.getZoomLevel()]; - console.log("page: " + pageNumber + ", zoom: " + newZoomLevel + ", prerender: " + prerender); + orientationDegrees = channel.getDocumentOrientationDegrees(); + console.log("page: " + pageNumber + ", zoom: " + newZoomLevel + + ", orientationDegrees: " + orientationDegrees + ", prerender: " + prerender); for (let i = 0; i < cache.length; i++) { const cached = cache[i]; - if (cached.pageNumber === pageNumber && cached.zoomLevel === newZoomLevel) { + if (cached.pageNumber === pageNumber && cached.zoomLevel === newZoomLevel && + cache.orientationDegrees == orientationDegrees) { if (useRender) { cache.splice(i, 1); cache.push(cached); @@ -89,7 +93,7 @@ function renderPage(pageNumber, lazy, prerender, prerenderTrigger=0) { } const newCanvas = document.createElement("canvas"); - const viewport = page.getViewport(newZoomLevel / 100) + const viewport = page.getViewport(newZoomLevel / 100, orientationDegrees) const ratio = window.devicePixelRatio; newCanvas.height = viewport.height * ratio; newCanvas.width = viewport.width * ratio; @@ -150,6 +154,7 @@ function renderPage(pageNumber, lazy, prerender, prerenderTrigger=0) { cache.push({ pageNumber: pageNumber, zoomLevel: newZoomLevel, + orientationDegrees: orientationDegrees, canvas: newCanvas, textLayerDiv: newTextLayerDiv }); @@ -163,7 +168,8 @@ function renderPage(pageNumber, lazy, prerender, prerenderTrigger=0) { function onRenderPage(lazy) { if (pageRendering) { - if (newPageNumber === channel.getPage() && newZoomLevel === zoomLevels[channel.getZoomLevel()]) { + if (newPageNumber === channel.getPage() && newZoomLevel === zoomLevels[channel.getZoomLevel()] && + orientationDegrees === channel.getDocumentOrientationDegrees()) { useRender = true; return; } diff --git a/app/src/main/java/org/grapheneos/pdfviewer/PdfViewer.java b/app/src/main/java/org/grapheneos/pdfviewer/PdfViewer.java index f7fb8f3..9f43ec0 100644 --- a/app/src/main/java/org/grapheneos/pdfviewer/PdfViewer.java +++ b/app/src/main/java/org/grapheneos/pdfviewer/PdfViewer.java @@ -86,6 +86,7 @@ public class PdfViewer extends AppCompatActivity implements LoaderManager.Loader public int mPage; public int mNumPages; private int mZoomLevel = 2; + private int mDocumentOrientationDegrees; private int mDocumentState; private List mDocumentProperties; private InputStream mInputStream; @@ -105,6 +106,11 @@ public class PdfViewer extends AppCompatActivity implements LoaderManager.Loader return mZoomLevel; } + @JavascriptInterface + public int getDocumentOrientationDegrees() { + return mDocumentOrientationDegrees; + } + @JavascriptInterface public void setNumPages(int numPages) { mNumPages = numPages; @@ -274,6 +280,14 @@ public class PdfViewer extends AppCompatActivity implements LoaderManager.Loader mWebView.evaluateJavascript(lazy ? "onRenderPage(true)" : "onRenderPage(false)", null); } + private void documentOrientationChanged(final int orientationDegreesOffset) { + mDocumentOrientationDegrees = (mDocumentOrientationDegrees + orientationDegreesOffset) % 360; + if (mDocumentOrientationDegrees < 0) { + mDocumentOrientationDegrees += 360; + } + renderPage(true); + } + private void openDocument() { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); @@ -345,7 +359,8 @@ public class PdfViewer extends AppCompatActivity implements LoaderManager.Loader @Override public boolean onPrepareOptionsMenu(Menu menu) { final int ids[] = { R.id.action_zoom_in, R.id.action_zoom_out, R.id.action_jump_to_page, - R.id.action_next, R.id.action_previous, R.id.action_view_document_properties }; + R.id.action_next, R.id.action_previous, R.id.action_rotate_clockwise, + R.id.action_rotate_counterclockwise, R.id.action_view_document_properties }; if (mDocumentState < STATE_LOADED) { for (final int id : ids) { final MenuItem item = menu.findItem(id); @@ -416,6 +431,14 @@ public class PdfViewer extends AppCompatActivity implements LoaderManager.Loader } return true; + case R.id.action_rotate_clockwise: + documentOrientationChanged(90); + return true; + + case R.id.action_rotate_counterclockwise: + documentOrientationChanged(-90); + return true; + case R.id.action_view_document_properties: DocumentPropertiesFragment .newInstance(mDocumentProperties) diff --git a/app/src/main/res/drawable-hdpi/ic_rotate_left_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_rotate_left_white_24dp.png new file mode 100644 index 0000000..e22d7b0 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_rotate_left_white_24dp.png differ diff --git a/app/src/main/res/drawable-hdpi/ic_rotate_right_white_24dp.png b/app/src/main/res/drawable-hdpi/ic_rotate_right_white_24dp.png new file mode 100644 index 0000000..fa7fccd Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_rotate_right_white_24dp.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_rotate_left_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_rotate_left_white_24dp.png new file mode 100644 index 0000000..a73d48c Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_rotate_left_white_24dp.png differ diff --git a/app/src/main/res/drawable-mdpi/ic_rotate_right_white_24dp.png b/app/src/main/res/drawable-mdpi/ic_rotate_right_white_24dp.png new file mode 100644 index 0000000..6750928 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_rotate_right_white_24dp.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_rotate_left_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_rotate_left_white_24dp.png new file mode 100644 index 0000000..029d35f Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_rotate_left_white_24dp.png differ diff --git a/app/src/main/res/drawable-xhdpi/ic_rotate_right_white_24dp.png b/app/src/main/res/drawable-xhdpi/ic_rotate_right_white_24dp.png new file mode 100644 index 0000000..4299904 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_rotate_right_white_24dp.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_rotate_left_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_rotate_left_white_24dp.png new file mode 100644 index 0000000..bdfcbca Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_rotate_left_white_24dp.png differ diff --git a/app/src/main/res/drawable-xxhdpi/ic_rotate_right_white_24dp.png b/app/src/main/res/drawable-xxhdpi/ic_rotate_right_white_24dp.png new file mode 100644 index 0000000..6d73012 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_rotate_right_white_24dp.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_rotate_left_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_rotate_left_white_24dp.png new file mode 100644 index 0000000..18be026 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_rotate_left_white_24dp.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/ic_rotate_right_white_24dp.png b/app/src/main/res/drawable-xxxhdpi/ic_rotate_right_white_24dp.png new file mode 100644 index 0000000..13e03d5 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_rotate_right_white_24dp.png differ diff --git a/app/src/main/res/menu/pdf_viewer.xml b/app/src/main/res/menu/pdf_viewer.xml index 516fb98..db6dddd 100644 --- a/app/src/main/res/menu/pdf_viewer.xml +++ b/app/src/main/res/menu/pdf_viewer.xml @@ -43,6 +43,18 @@ android:title="@string/action_jump_to_page" app:showAsAction="ifRoom" /> + + + + Open document Zoom out Zoom in + Rotate clockwise + Rotate counterclockwise Jump to page Properties