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 diff --git a/app/build.gradle.kts b/app/build.gradle.kts index be63696..5595679 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -76,5 +76,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") } diff --git a/app/pdfjs-dist b/app/pdfjs-dist index cc3d3bf..5f07d5a 160000 --- a/app/pdfjs-dist +++ b/app/pdfjs-dist @@ -1 +1 @@ -Subproject commit cc3d3bf299ae11f8f72ae8d64cbf19b340f9a996 +Subproject commit 5f07d5a4159bb99eee2f6143d1297f03b45bba58 diff --git a/app/src/main/assets/viewer.css b/app/src/main/assets/viewer.css index 999ba10..48bf80a 100644 --- a/app/src/main/assets/viewer.css +++ b/app/src/main/assets/viewer.css @@ -1,20 +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 @@ - -
+
+ +
+
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); diff --git a/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java b/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java index 3c7123f..2bcad8a 100644 --- a/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java +++ b/app/src/main/java/app/grapheneos/pdfviewer/PdfViewer.java @@ -216,6 +216,7 @@ public class PdfViewer implements LoaderManager.LoaderCallbacks 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); } 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) } 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 fb12f44..cff47c9 100644 --- a/app/src/main/java/app/grapheneos/pdfviewer/loader/DocumentPropertiesLoader.java +++ b/app/src/main/java/app/grapheneos/pdfviewer/loader/DocumentPropertiesLoader.java @@ -98,7 +98,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)); diff --git a/build.gradle.kts b/build.gradle.kts index aae2920..78e1149 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -10,8 +10,8 @@ buildscript { } } dependencies { - classpath("com.android.tools.build:gradle:7.3.0") - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.20") + classpath("com.android.tools.build:gradle:7.3.1") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.22") } }