diff --git a/app/src/main/assets/viewer.css b/app/src/main/assets/viewer.css index aebadbf..23fcef8 100644 --- a/app/src/main/assets/viewer.css +++ b/app/src/main/assets/viewer.css @@ -1,3 +1,8 @@ +:root { + --text-layer-opacity: 0.2; + --text-layer-foreground: transparent; +} + html, body { height: 100%; } @@ -34,13 +39,13 @@ canvas, .textLayer { .textLayer { text-align: initial; overflow: hidden; - opacity: 0.2; + opacity: var(--text-layer-opacity); line-height: 1; } .textLayer span, .textLayer br { - color: transparent; + color: var(--text-layer-foreground); position: absolute; white-space: pre; cursor: text; diff --git a/app/src/main/assets/viewer.js b/app/src/main/assets/viewer.js index 84290ce..c27023a 100644 --- a/app/src/main/assets/viewer.js +++ b/app/src/main/assets/viewer.js @@ -20,6 +20,8 @@ let useRender; const cache = []; const maxCached = 6; +let isTextLayerVisible = false; + function maybeRenderNextPage() { if (renderPending) { pageRendering = false; @@ -209,6 +211,18 @@ function isTextSelected() { return window.getSelection().toString() !== ""; } +function toggleTextLayerVisibility() { + let textLayerForeground = "red"; + let textLayerOpacity = 1; + if (isTextLayerVisible) { + textLayerForeground = "transparent"; + textLayerOpacity = 0.2; + } + document.documentElement.style.setProperty("--text-layer-foreground", textLayerForeground); + document.documentElement.style.setProperty("--text-layer-opacity", textLayerOpacity.toString()); + isTextLayerVisible = !isTextLayerVisible; +} + function loadDocument() { const pdfPassword = channel.getPassword(); const loadingTask = pdfjsLib.getDocument({ url: "https://localhost/placeholder.pdf", password: pdfPassword }); diff --git a/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java b/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java index f920826..474efcc 100644 --- a/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java +++ b/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java @@ -51,6 +51,8 @@ import app.grapheneos.pdfviewer.viewModel.PasswordStatus; import java.io.IOException; import java.io.InputStream; import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -618,15 +620,21 @@ public class PdfViewer extends AppCompatActivity implements LoaderManager.Loader super.onCreateOptionsMenu(menu); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.pdf_viewer, menu); + if (BuildConfig.DEBUG) { + inflater.inflate(R.menu.pdf_viewer_debug, menu); + } return true; } @Override public boolean onPrepareOptionsMenu(@NonNull Menu menu) { - final int[] ids = {R.id.action_jump_to_page, R.id.action_next, R.id.action_previous, - R.id.action_first, R.id.action_last, R.id.action_rotate_clockwise, - R.id.action_rotate_counterclockwise, R.id.action_view_document_properties, - R.id.action_share, R.id.action_save_as}; + final ArrayList ids = new ArrayList<>(Arrays.asList(R.id.action_jump_to_page, + R.id.action_next, R.id.action_previous, R.id.action_first, R.id.action_last, + R.id.action_rotate_clockwise, R.id.action_rotate_counterclockwise, + R.id.action_view_document_properties, R.id.action_share, R.id.action_save_as)); + if (BuildConfig.DEBUG) { + ids.add(R.id.debug_action_toggle_text_layer_visibility); + } if (mDocumentState < STATE_LOADED) { for (final int id : ids) { final MenuItem item = menu.findItem(id); @@ -691,6 +699,9 @@ public class PdfViewer extends AppCompatActivity implements LoaderManager.Loader return true; } else if (itemId == R.id.action_save_as) { saveDocument(); + } else if (itemId == R.id.debug_action_toggle_text_layer_visibility) { + binding.webview.evaluateJavascript("toggleTextLayerVisibility()", null); + return true; } return super.onOptionsItemSelected(item); diff --git a/app/src/main/res/menu/pdf_viewer_debug.xml b/app/src/main/res/menu/pdf_viewer_debug.xml new file mode 100644 index 0000000..5b5c13c --- /dev/null +++ b/app/src/main/res/menu/pdf_viewer_debug.xml @@ -0,0 +1,10 @@ + + + + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 74c60d1..79cb1e5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -14,6 +14,8 @@ Save as Properties + Toggle text layer visibility + Invalid date Failed to obtain document metadata