libpdfviewer: update to PdfViewer 16
This commit is contained in:
commit
6e8fdb56a5
4
.github/workflows/build.yml
vendored
4
.github/workflows/build.yml
vendored
@ -10,11 +10,11 @@ jobs:
|
|||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
- name: Set up JDK 18
|
- name: Set up JDK 19
|
||||||
uses: actions/setup-java@v3
|
uses: actions/setup-java@v3
|
||||||
with:
|
with:
|
||||||
distribution: 'temurin'
|
distribution: 'temurin'
|
||||||
java-version: 18
|
java-version: 19
|
||||||
cache: gradle
|
cache: gradle
|
||||||
- name: Build with Gradle
|
- name: Build with Gradle
|
||||||
run: ./gradlew build --no-daemon
|
run: ./gradlew build --no-daemon
|
||||||
|
@ -76,5 +76,5 @@ android {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation("androidx.appcompat:appcompat:1.5.1")
|
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")
|
||||||
}
|
}
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit cc3d3bf299ae11f8f72ae8d64cbf19b340f9a996
|
Subproject commit 5f07d5a4159bb99eee2f6143d1297f03b45bba58
|
@ -1,20 +1,36 @@
|
|||||||
|
html, body {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
body, canvas {
|
body, canvas {
|
||||||
padding: 0;
|
padding: 0;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
canvas {
|
body {
|
||||||
margin: auto;
|
background-color: #c0c0c0;
|
||||||
display: block;
|
}
|
||||||
|
|
||||||
|
#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 {
|
.textLayer {
|
||||||
position: absolute;
|
|
||||||
text-align: initial;
|
text-align: initial;
|
||||||
left: 0;
|
|
||||||
top: 0;
|
|
||||||
right: 0;
|
|
||||||
bottom: 0;
|
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
opacity: 0.2;
|
opacity: 0.2;
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
|
@ -7,8 +7,10 @@
|
|||||||
<script src="pdf.js"></script>
|
<script src="pdf.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<canvas id="content"></canvas>
|
<div id="container">
|
||||||
<div id="text" class="textLayer"></div>
|
<canvas id="content"></canvas>
|
||||||
|
<div id="text" class="textLayer"></div>
|
||||||
|
</div>
|
||||||
<script src="viewer.js"></script>
|
<script src="viewer.js"></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -73,7 +73,7 @@ function renderPage(pageNumber, zoom, prerender, prerenderTrigger=0) {
|
|||||||
for (let i = 0; i < cache.length; i++) {
|
for (let i = 0; i < cache.length; i++) {
|
||||||
const cached = cache[i];
|
const cached = cache[i];
|
||||||
if (cached.pageNumber === pageNumber && cached.zoomRatio === newZoomRatio &&
|
if (cached.pageNumber === pageNumber && cached.zoomRatio === newZoomRatio &&
|
||||||
cache.orientationDegrees === orientationDegrees) {
|
cached.orientationDegrees === orientationDegrees) {
|
||||||
if (useRender) {
|
if (useRender) {
|
||||||
cache.splice(i, 1);
|
cache.splice(i, 1);
|
||||||
cache.push(cached);
|
cache.push(cached);
|
||||||
|
@ -216,6 +216,7 @@ public class PdfViewer implements LoaderManager.LoaderCallbacks<List<CharSequenc
|
|||||||
settings.setAllowFileAccess(false);
|
settings.setAllowFileAccess(false);
|
||||||
settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
|
settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
|
||||||
settings.setJavaScriptEnabled(true);
|
settings.setJavaScriptEnabled(true);
|
||||||
|
settings.setMinimumFontSize(1);
|
||||||
|
|
||||||
CookieManager.getInstance().setAcceptCookie(false);
|
CookieManager.getInstance().setAcceptCookie(false);
|
||||||
|
|
||||||
@ -460,12 +461,12 @@ public class PdfViewer implements LoaderManager.LoaderCallbacks<List<CharSequenc
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void showSystemUi() {
|
private void showSystemUi() {
|
||||||
ViewKt.showSystemUi(binding.getRoot());
|
ViewKt.showSystemUi(binding.getRoot(), activity.getWindow());
|
||||||
activity.getSupportActionBar().show();
|
activity.getSupportActionBar().show();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void hideSystemUi() {
|
private void hideSystemUi() {
|
||||||
ViewKt.hideSystemUi(binding.getRoot());
|
ViewKt.hideSystemUi(binding.getRoot(), activity.getWindow());
|
||||||
activity.getSupportActionBar().hide();
|
activity.getSupportActionBar().hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -481,12 +482,12 @@ public class PdfViewer implements LoaderManager.LoaderCallbacks<List<CharSequenc
|
|||||||
mToast.show();
|
mToast.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onCreateOptionMenu(Menu menu) {
|
public void onCreateOptionMenu(@NonNull Menu menu) {
|
||||||
MenuInflater inflater = activity.getMenuInflater();
|
MenuInflater inflater = activity.getMenuInflater();
|
||||||
inflater.inflate(R.menu.pdf_viewer, menu);
|
inflater.inflate(R.menu.pdf_viewer, menu);
|
||||||
}
|
}
|
||||||
|
|
||||||
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,
|
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_first, R.id.action_last, R.id.action_rotate_clockwise,
|
||||||
R.id.action_rotate_counterclockwise, R.id.action_view_document_properties};
|
R.id.action_rotate_counterclockwise, R.id.action_view_document_properties};
|
||||||
|
@ -25,6 +25,14 @@ public class Utils {
|
|||||||
return format.format(kb / 1000) + " MB (" + fileSize + " Bytes)";
|
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)
|
// Parse date as per PDF spec (complies with PDF v1.4 to v1.7)
|
||||||
public static String parseDate(String date) throws ParseException {
|
public static String parseDate(String date) throws ParseException {
|
||||||
int position = 0;
|
int position = 0;
|
||||||
@ -45,7 +53,7 @@ public class Utils {
|
|||||||
if (!TextUtils.isDigitsOnly(field)) {
|
if (!TextUtils.isDigitsOnly(field)) {
|
||||||
throw new ParseException("Invalid year", position);
|
throw new ParseException("Invalid year", position);
|
||||||
}
|
}
|
||||||
int year = Integer.parseInt(field);
|
int year = parseIntSafely(field);
|
||||||
if (year > currentYear) {
|
if (year > currentYear) {
|
||||||
year = currentYear;
|
year = currentYear;
|
||||||
}
|
}
|
||||||
@ -66,7 +74,7 @@ public class Utils {
|
|||||||
if (!TextUtils.isDigitsOnly(field)) {
|
if (!TextUtils.isDigitsOnly(field)) {
|
||||||
throw new ParseException("Invalid month", position);
|
throw new ParseException("Invalid month", position);
|
||||||
}
|
}
|
||||||
month = Integer.parseInt(field) - 1;
|
month = parseIntSafely(field) - 1;
|
||||||
if (month > 11) {
|
if (month > 11) {
|
||||||
throw new ParseException("Invalid month", position);
|
throw new ParseException("Invalid month", position);
|
||||||
}
|
}
|
||||||
@ -77,7 +85,7 @@ public class Utils {
|
|||||||
if (!TextUtils.isDigitsOnly(field)) {
|
if (!TextUtils.isDigitsOnly(field)) {
|
||||||
throw new ParseException("Invalid day", position);
|
throw new ParseException("Invalid day", position);
|
||||||
}
|
}
|
||||||
day = Integer.parseInt(field);
|
day = parseIntSafely(field);
|
||||||
if (day > 31) {
|
if (day > 31) {
|
||||||
throw new ParseException("Invalid day", position);
|
throw new ParseException("Invalid day", position);
|
||||||
}
|
}
|
||||||
@ -88,7 +96,7 @@ public class Utils {
|
|||||||
if (!TextUtils.isDigitsOnly(field)) {
|
if (!TextUtils.isDigitsOnly(field)) {
|
||||||
throw new ParseException("Invalid hours", position);
|
throw new ParseException("Invalid hours", position);
|
||||||
}
|
}
|
||||||
hours = Integer.parseInt(field);
|
hours = parseIntSafely(field);
|
||||||
if (hours > 23) {
|
if (hours > 23) {
|
||||||
throw new ParseException("Invalid hours", position);
|
throw new ParseException("Invalid hours", position);
|
||||||
}
|
}
|
||||||
@ -99,7 +107,7 @@ public class Utils {
|
|||||||
if (!TextUtils.isDigitsOnly(field)) {
|
if (!TextUtils.isDigitsOnly(field)) {
|
||||||
throw new ParseException("Invalid minutes", position);
|
throw new ParseException("Invalid minutes", position);
|
||||||
}
|
}
|
||||||
minutes = Integer.parseInt(field);
|
minutes = parseIntSafely(field);
|
||||||
if (minutes > 59) {
|
if (minutes > 59) {
|
||||||
throw new ParseException("Invalid minutes", position);
|
throw new ParseException("Invalid minutes", position);
|
||||||
}
|
}
|
||||||
@ -110,7 +118,7 @@ public class Utils {
|
|||||||
if (!TextUtils.isDigitsOnly(field)) {
|
if (!TextUtils.isDigitsOnly(field)) {
|
||||||
throw new ParseException("Invalid seconds", position);
|
throw new ParseException("Invalid seconds", position);
|
||||||
}
|
}
|
||||||
seconds = Integer.parseInt(field);
|
seconds = parseIntSafely(field);
|
||||||
if (seconds > 59) {
|
if (seconds > 59) {
|
||||||
throw new ParseException("Invalid seconds", position);
|
throw new ParseException("Invalid seconds", position);
|
||||||
}
|
}
|
||||||
@ -134,7 +142,7 @@ public class Utils {
|
|||||||
if (!TextUtils.isDigitsOnly(field)) {
|
if (!TextUtils.isDigitsOnly(field)) {
|
||||||
throw new ParseException("Invalid UTC offset hours", position);
|
throw new ParseException("Invalid UTC offset hours", position);
|
||||||
}
|
}
|
||||||
offsetHours = Integer.parseInt(field);
|
offsetHours = parseIntSafely(field);
|
||||||
final int offsetHoursMinutes = offsetHours * 100 + offsetMinutes;
|
final int offsetHoursMinutes = offsetHours * 100 + offsetMinutes;
|
||||||
|
|
||||||
// Validate UTC offset (UTC-12:00 to UTC+14:00)
|
// Validate UTC offset (UTC-12:00 to UTC+14:00)
|
||||||
@ -157,7 +165,7 @@ public class Utils {
|
|||||||
if (!TextUtils.isDigitsOnly(field)) {
|
if (!TextUtils.isDigitsOnly(field)) {
|
||||||
throw new ParseException("Invalid UTC offset minutes", position);
|
throw new ParseException("Invalid UTC offset minutes", position);
|
||||||
}
|
}
|
||||||
offsetMinutes = Integer.parseInt(field);
|
offsetMinutes = parseIntSafely(field);
|
||||||
if (offsetMinutes > 59) {
|
if (offsetMinutes > 59) {
|
||||||
throw new ParseException("Invalid UTC offset minutes", position);
|
throw new ParseException("Invalid UTC offset minutes", position);
|
||||||
}
|
}
|
||||||
|
@ -1,19 +1,20 @@
|
|||||||
package app.grapheneos.pdfviewer.ktx
|
package app.grapheneos.pdfviewer.ktx
|
||||||
|
|
||||||
import android.view.View
|
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.WindowInsetsCompat
|
||||||
import androidx.core.view.WindowInsetsControllerCompat
|
import androidx.core.view.WindowInsetsControllerCompat
|
||||||
|
|
||||||
private val systemBars = WindowInsetsCompat.Type.statusBars()
|
private val systemBars = WindowInsetsCompat.Type.statusBars()
|
||||||
|
|
||||||
fun View.hideSystemUi() {
|
fun View.hideSystemUi(window: Window) {
|
||||||
val controller = ViewCompat.getWindowInsetsController(this) ?: return
|
val controller = WindowCompat.getInsetsController(window, this)
|
||||||
controller.systemBarsBehavior =
|
controller.systemBarsBehavior =
|
||||||
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
|
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
|
||||||
controller.hide(systemBars)
|
controller.hide(systemBars)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun View.showSystemUi() {
|
fun View.showSystemUi(window: Window) {
|
||||||
ViewCompat.getWindowInsetsController(this)?.show(systemBars)
|
WindowCompat.getInsetsController(window, this).show(systemBars)
|
||||||
}
|
}
|
||||||
|
@ -98,7 +98,7 @@ public class DocumentPropertiesLoader extends AsyncTaskLoader<List<CharSequence>
|
|||||||
final SpannableStringBuilder property = new SpannableStringBuilder(name).append(":\n");
|
final SpannableStringBuilder property = new SpannableStringBuilder(name).append(":\n");
|
||||||
final String value = json != null ? json.optString(specName, "-") : specName;
|
final String value = json != null ? json.optString(specName, "-") : specName;
|
||||||
|
|
||||||
if (specName.endsWith("Date")) {
|
if (specName != null && specName.endsWith("Date")) {
|
||||||
final Context context = getContext();
|
final Context context = getContext();
|
||||||
try {
|
try {
|
||||||
property.append(value.equals("-") ? value : Utils.parseDate(value));
|
property.append(value.equals("-") ? value : Utils.parseDate(value));
|
||||||
|
@ -10,8 +10,8 @@ buildscript {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
dependencies {
|
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")
|
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.22")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user