From 7ff831769e3db0a4fa453e0cffda9b8a4bd25c3b Mon Sep 17 00:00:00 2001 From: Pratyush Date: Sun, 2 Oct 2022 18:41:07 +0530 Subject: [PATCH 01/16] add missing NonNull annotation --- app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java b/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java index 15b3493..ad8ef55 100644 --- a/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java +++ b/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java @@ -601,7 +601,7 @@ public class PdfViewer extends AppCompatActivity implements LoaderManager.Loader } @Override - public boolean onCreateOptionsMenu(Menu menu) { + public boolean onCreateOptionsMenu(@NonNull Menu menu) { super.onCreateOptionsMenu(menu); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.pdf_viewer, menu); @@ -609,7 +609,7 @@ public class PdfViewer extends AppCompatActivity implements LoaderManager.Loader } @Override - public boolean onPrepareOptionsMenu(Menu menu) { + 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, From 5fadf7f47dff71b1870351fe21468f2ed96fbd44 Mon Sep 17 00:00:00 2001 From: Pratyush Date: Sun, 2 Oct 2022 18:42:24 +0530 Subject: [PATCH 02/16] replace deprecated api uses --- .../main/java/app/grapheneos/pdfviewer/PdfViewer.java | 4 ++-- .../main/java/app/grapheneos/pdfviewer/ktx/View.kt | 11 ++++++----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java b/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java index ad8ef55..ca2ad96 100644 --- a/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java +++ b/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java @@ -569,12 +569,12 @@ public class PdfViewer extends AppCompatActivity implements LoaderManager.Loader } private void showSystemUi() { - ViewKt.showSystemUi(binding.getRoot()); + ViewKt.showSystemUi(binding.getRoot(), getWindow()); getSupportActionBar().show(); } private void hideSystemUi() { - ViewKt.hideSystemUi(binding.getRoot()); + ViewKt.hideSystemUi(binding.getRoot(), getWindow()); getSupportActionBar().hide(); } diff --git a/app/src/main/java/app/grapheneos/pdfviewer/ktx/View.kt b/app/src/main/java/app/grapheneos/pdfviewer/ktx/View.kt index 435e78e..deb3038 100644 --- a/app/src/main/java/app/grapheneos/pdfviewer/ktx/View.kt +++ b/app/src/main/java/app/grapheneos/pdfviewer/ktx/View.kt @@ -1,19 +1,20 @@ package app.grapheneos.pdfviewer.ktx import android.view.View -import androidx.core.view.ViewCompat +import android.view.Window +import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsControllerCompat private val systemBars = WindowInsetsCompat.Type.statusBars() -fun View.hideSystemUi() { - val controller = ViewCompat.getWindowInsetsController(this) ?: return +fun View.hideSystemUi(window: Window) { + val controller = WindowCompat.getInsetsController(window, this) controller.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE controller.hide(systemBars) } -fun View.showSystemUi() { - ViewCompat.getWindowInsetsController(this)?.show(systemBars) +fun View.showSystemUi(window: Window) { + WindowCompat.getInsetsController(window, this).show(systemBars) } From ee87e43bcbc40d5555b7955283604f8897b5cf19 Mon Sep 17 00:00:00 2001 From: Pratyush Date: Sun, 2 Oct 2022 18:44:35 +0530 Subject: [PATCH 03/16] handle `OutOfMemoryError | IllegalArgumentException` --- app/src/main/java/app/grapheneos/pdfviewer/KtUtils.kt | 7 ++++++- app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java | 3 +-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/app/grapheneos/pdfviewer/KtUtils.kt b/app/src/main/java/app/grapheneos/pdfviewer/KtUtils.kt index 3f67aa6..175ede3 100644 --- a/app/src/main/java/app/grapheneos/pdfviewer/KtUtils.kt +++ b/app/src/main/java/app/grapheneos/pdfviewer/KtUtils.kt @@ -7,7 +7,12 @@ import java.io.IOException import java.io.InputStream import java.io.OutputStream -@Throws(FileNotFoundException::class, IOException::class) +@Throws( + FileNotFoundException::class, + IOException::class, + IllegalArgumentException::class, + OutOfMemoryError::class +) fun saveAs(context: Context, existingUri: Uri, saveAs: Uri) { context.asInputStream(existingUri)?.use { inputStream -> diff --git a/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java b/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java index ca2ad96..2049a1b 100644 --- a/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java +++ b/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java @@ -709,8 +709,7 @@ public class PdfViewer extends AppCompatActivity implements LoaderManager.Loader private void saveDocumentAs(Uri uri) { try { KtUtilsKt.saveAs(this, mUri, uri); - } catch (IOException e) { - e.printStackTrace(); + } catch (IOException | OutOfMemoryError | IllegalArgumentException e) { snackbar.setText(R.string.error_while_saving).show(); } } From 221e45cd52d4659b3fb914c3fef0891fc27fd427 Mon Sep 17 00:00:00 2001 From: Pratyush Date: Sun, 2 Oct 2022 19:02:09 +0530 Subject: [PATCH 04/16] handle `NumberFormatException` caused by `Integer.parseInt` --- .../java/app/grapheneos/pdfviewer/Utils.java | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/app/grapheneos/pdfviewer/Utils.java b/app/src/main/java/app/grapheneos/pdfviewer/Utils.java index 01ff166..3199b70 100644 --- a/app/src/main/java/app/grapheneos/pdfviewer/Utils.java +++ b/app/src/main/java/app/grapheneos/pdfviewer/Utils.java @@ -25,6 +25,14 @@ public class Utils { return format.format(kb / 1000) + " MB (" + fileSize + " Bytes)"; } + private static int parseIntSafely(String field) throws ParseException { + try { + return Integer.parseInt(field); + } catch (NumberFormatException e) { + throw new ParseException("Error while parsing int", -1); + } + } + // Parse date as per PDF spec (complies with PDF v1.4 to v1.7) public static String parseDate(String date) throws ParseException { int position = 0; @@ -45,7 +53,7 @@ public class Utils { if (!TextUtils.isDigitsOnly(field)) { throw new ParseException("Invalid year", position); } - int year = Integer.parseInt(field); + int year = parseIntSafely(field); if (year > currentYear) { year = currentYear; } @@ -66,7 +74,7 @@ public class Utils { if (!TextUtils.isDigitsOnly(field)) { throw new ParseException("Invalid month", position); } - month = Integer.parseInt(field) - 1; + month = parseIntSafely(field) - 1; if (month > 11) { throw new ParseException("Invalid month", position); } @@ -77,7 +85,7 @@ public class Utils { if (!TextUtils.isDigitsOnly(field)) { throw new ParseException("Invalid day", position); } - day = Integer.parseInt(field); + day = parseIntSafely(field); if (day > 31) { throw new ParseException("Invalid day", position); } @@ -88,7 +96,7 @@ public class Utils { if (!TextUtils.isDigitsOnly(field)) { throw new ParseException("Invalid hours", position); } - hours = Integer.parseInt(field); + hours = parseIntSafely(field); if (hours > 23) { throw new ParseException("Invalid hours", position); } @@ -99,7 +107,7 @@ public class Utils { if (!TextUtils.isDigitsOnly(field)) { throw new ParseException("Invalid minutes", position); } - minutes = Integer.parseInt(field); + minutes = parseIntSafely(field); if (minutes > 59) { throw new ParseException("Invalid minutes", position); } @@ -110,7 +118,7 @@ public class Utils { if (!TextUtils.isDigitsOnly(field)) { throw new ParseException("Invalid seconds", position); } - seconds = Integer.parseInt(field); + seconds = parseIntSafely(field); if (seconds > 59) { throw new ParseException("Invalid seconds", position); } @@ -134,7 +142,7 @@ public class Utils { if (!TextUtils.isDigitsOnly(field)) { throw new ParseException("Invalid UTC offset hours", position); } - offsetHours = Integer.parseInt(field); + offsetHours = parseIntSafely(field); final int offsetHoursMinutes = offsetHours * 100 + offsetMinutes; // Validate UTC offset (UTC-12:00 to UTC+14:00) @@ -157,7 +165,7 @@ public class Utils { if (!TextUtils.isDigitsOnly(field)) { throw new ParseException("Invalid UTC offset minutes", position); } - offsetMinutes = Integer.parseInt(field); + offsetMinutes = parseIntSafely(field); if (offsetMinutes > 59) { throw new ParseException("Invalid UTC offset minutes", position); } From 8d0caf65a2e60901f1eb1e7eea3c31bbc785a378 Mon Sep 17 00:00:00 2001 From: Pratyush Date: Sun, 2 Oct 2022 19:40:55 +0530 Subject: [PATCH 05/16] avoid `NullPointerException` --- .../grapheneos/pdfviewer/loader/DocumentPropertiesLoader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/app/grapheneos/pdfviewer/loader/DocumentPropertiesLoader.java b/app/src/main/java/app/grapheneos/pdfviewer/loader/DocumentPropertiesLoader.java index d9f2e62..a45070a 100644 --- a/app/src/main/java/app/grapheneos/pdfviewer/loader/DocumentPropertiesLoader.java +++ b/app/src/main/java/app/grapheneos/pdfviewer/loader/DocumentPropertiesLoader.java @@ -132,7 +132,7 @@ public class DocumentPropertiesLoader extends AsyncTaskLoader final SpannableStringBuilder property = new SpannableStringBuilder(name).append(":\n"); final String value = json != null ? json.optString(specName, "-") : specName; - if (specName.endsWith("Date")) { + if (specName != null && specName.endsWith("Date")) { final Context context = getContext(); try { property.append(value.equals("-") ? value : Utils.parseDate(value)); From fbd6c45c3f79cc19238577dbfab96d1c3558ffdf Mon Sep 17 00:00:00 2001 From: loryeam Date: Mon, 3 Oct 2022 08:09:07 +0000 Subject: [PATCH 06/16] fix a typo in viewer.js which can cause cache miss --- app/src/main/assets/viewer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/assets/viewer.js b/app/src/main/assets/viewer.js index 280015d..34fc49d 100644 --- a/app/src/main/assets/viewer.js +++ b/app/src/main/assets/viewer.js @@ -73,7 +73,7 @@ function renderPage(pageNumber, zoom, prerender, prerenderTrigger=0) { for (let i = 0; i < cache.length; i++) { const cached = cache[i]; if (cached.pageNumber === pageNumber && cached.zoomRatio === newZoomRatio && - cache.orientationDegrees === orientationDegrees) { + cached.orientationDegrees === orientationDegrees) { if (useRender) { cache.splice(i, 1); cache.push(cached); From eead76ad86dfe786f71008d2603c4fb9b2ed9ce3 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Tue, 4 Oct 2022 12:31:21 -0400 Subject: [PATCH 07/16] increment version to 16 --- app/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 1434d46..21fd5b5 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -41,7 +41,7 @@ android { applicationId = "app.grapheneos.pdfviewer" minSdk = 26 targetSdk = 33 - versionCode = 15 + versionCode = 16 versionName = versionCode.toString() resourceConfigurations.add("en") } From a73caa59146967db95e94f8e7b17cf8504fa971f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Oct 2022 21:06:12 +0000 Subject: [PATCH 08/16] Bump gradle from 7.3.0 to 7.3.1 Bumps gradle from 7.3.0 to 7.3.1. --- updated-dependencies: - dependency-name: com.android.tools.build:gradle dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index aae2920..ef06d01 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -10,7 +10,7 @@ buildscript { } } dependencies { - classpath("com.android.tools.build:gradle:7.3.0") + classpath("com.android.tools.build:gradle:7.3.1") classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.20") } } From 22bd993a754626768210a63c04cdb07ef9b796fd Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Wed, 19 Oct 2022 19:27:19 -0400 Subject: [PATCH 09/16] update to JDK 19 --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 350d32a..e9b8f62 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,11 +10,11 @@ jobs: - uses: actions/checkout@v3 with: submodules: true - - name: Set up JDK 18 + - name: Set up JDK 19 uses: actions/setup-java@v3 with: distribution: 'temurin' - java-version: 18 + java-version: 19 cache: gradle - name: Build with Gradle run: ./gradlew build --no-daemon From e1dd3db05adb7a56e3b7eab7f5c8d6b01ede254d Mon Sep 17 00:00:00 2001 From: smdyv <88971341+smdyv@users.noreply.github.com> Date: Tue, 25 Oct 2022 20:38:30 +0200 Subject: [PATCH 10/16] Bump material from 1.6.1 to 1.7.0 --- app/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 21fd5b5..903bfae 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -85,5 +85,5 @@ android { dependencies { implementation("androidx.appcompat:appcompat:1.5.1") - implementation("com.google.android.material:material:1.6.1") + implementation("com.google.android.material:material:1.7.0") } From ed3cf2c08f2abd002d1845d0a91706acb399b9c6 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Sat, 29 Oct 2022 21:11:07 -0400 Subject: [PATCH 11/16] remove no-op allowBackup This was added to silence a now removed lint check. --- app/src/main/AndroidManifest.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 27fa5a0..d93258c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,7 +4,6 @@ Date: Tue, 8 Nov 2022 21:02:40 +0000 Subject: [PATCH 12/16] Bump kotlin-gradle-plugin from 1.7.20 to 1.7.21 Bumps [kotlin-gradle-plugin](https://github.com/JetBrains/kotlin) from 1.7.20 to 1.7.21. - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/commits) --- updated-dependencies: - dependency-name: org.jetbrains.kotlin:kotlin-gradle-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index ef06d01..bfaeaf8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,7 +11,7 @@ buildscript { } dependencies { classpath("com.android.tools.build:gradle:7.3.1") - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.20") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.21") } } From abfb212011841f56cfe3e3b1308e4181be9a8e7e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Nov 2022 21:02:34 +0000 Subject: [PATCH 13/16] Bump kotlin-gradle-plugin from 1.7.21 to 1.7.22 Bumps [kotlin-gradle-plugin](https://github.com/JetBrains/kotlin) from 1.7.21 to 1.7.22. - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v1.7.21...v1.7.22) --- updated-dependencies: - dependency-name: org.jetbrains.kotlin:kotlin-gradle-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index bfaeaf8..78e1149 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,7 +11,7 @@ buildscript { } dependencies { classpath("com.android.tools.build:gradle:7.3.1") - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.21") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.22") } } From ac4aa0bbb9b7b487b6487d8c81c6b10da0bf21d7 Mon Sep 17 00:00:00 2001 From: octocorvus Date: Sun, 4 Dec 2022 21:52:43 +0530 Subject: [PATCH 14/16] [webview] set minimum font size to 1px This fixes an issue where some text layer divs (those with font size < 8px) gets misaligned due to webview setting their font size to 8px. --- app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java b/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java index 2049a1b..812fb0d 100644 --- a/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java +++ b/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java @@ -252,6 +252,7 @@ public class PdfViewer extends AppCompatActivity implements LoaderManager.Loader settings.setAllowFileAccess(false); settings.setCacheMode(WebSettings.LOAD_NO_CACHE); settings.setJavaScriptEnabled(true); + settings.setMinimumFontSize(1); CookieManager.getInstance().setAcceptCookie(false); From 1cf1c7ec281d275170230c74a45db9c1e8c1712f Mon Sep 17 00:00:00 2001 From: loryeam Date: Sun, 20 Nov 2022 15:21:13 +0000 Subject: [PATCH 15/16] horizontally and vertically center canvas and text layer Also fixes an issue where text layer is not exactly on top of the canvas when canvas width is less than screen width (which happens often in landscape mode or when fully zoomed out) --- app/src/main/assets/viewer.css | 32 ++++++++++++++++++++++---------- app/src/main/assets/viewer.html | 6 ++++-- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/app/src/main/assets/viewer.css b/app/src/main/assets/viewer.css index 9f136d5..48bf80a 100644 --- a/app/src/main/assets/viewer.css +++ b/app/src/main/assets/viewer.css @@ -1,24 +1,36 @@ +html, body { + height: 100%; +} + body, canvas { padding: 0; margin: 0; } -canvas { - margin: auto; - display: block; -} - body { background-color: #c0c0c0; } +#container { + width: 100%; + height: 100%; + display: grid; + place-items: center; +} + +#container canvas, #container .textLayer { + /* overlay child elements on top of each other */ + grid-row-start: 1; + grid-column-start: 1; +} + +canvas, .textLayer { + display: inline-block; + position: relative; +} + .textLayer { - position: absolute; text-align: initial; - left: 0; - top: 0; - right: 0; - bottom: 0; overflow: hidden; opacity: 0.2; line-height: 1; diff --git a/app/src/main/assets/viewer.html b/app/src/main/assets/viewer.html index c4f1125..d385122 100644 --- a/app/src/main/assets/viewer.html +++ b/app/src/main/assets/viewer.html @@ -7,8 +7,10 @@ - -
+
+ +
+
From 99c8c13fecf4ce5f6e528bc9cbd55b9e6168921b Mon Sep 17 00:00:00 2001 From: randomhydrosol Date: Mon, 5 Dec 2022 05:30:24 +0530 Subject: [PATCH 16/16] update pdfjs to v3.1.81 --- third_party/pdfjs-dist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/third_party/pdfjs-dist b/third_party/pdfjs-dist index cc3d3bf..eb245b8 160000 --- a/third_party/pdfjs-dist +++ b/third_party/pdfjs-dist @@ -1 +1 @@ -Subproject commit cc3d3bf299ae11f8f72ae8d64cbf19b340f9a996 +Subproject commit eb245b8de89c8d631d175ae937136de54ea3ed51