From 43cb2cd101c19cc4ca6d6c8331f11e6dc2729ab7 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Sat, 31 May 2025 18:28:50 +0200 Subject: [PATCH] android: dependency upgrades --- android/.gitignore | 1 + android/app/build.gradle | 18 ++++---- .../media/ExifInterfaceFork.java | 42 +++++++++++++------ .../media/ExifInterfaceUtilsFork.java | 2 +- 4 files changed, 41 insertions(+), 22 deletions(-) diff --git a/android/.gitignore b/android/.gitignore index 82677b89f..5343532a4 100644 --- a/android/.gitignore +++ b/android/.gitignore @@ -7,6 +7,7 @@ gradle-wrapper.jar GeneratedPluginRegistrant.java .cxx/ .kotlin/ +/build/ # Remember to never publicly share your keystore. # See https://flutter.dev/to/reference-keystore diff --git a/android/app/build.gradle b/android/app/build.gradle index 42711a403..27989b52b 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -152,12 +152,12 @@ dependencies { implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.1' implementation "androidx.appcompat:appcompat:1.7.0" - implementation 'androidx.core:core-ktx:1.15.0' - implementation 'androidx.lifecycle:lifecycle-process:2.8.7' + implementation 'androidx.core:core-ktx:1.16.0' + implementation 'androidx.lifecycle:lifecycle-process:2.9.0' implementation 'androidx.media:media:1.7.0' implementation 'androidx.multidex:multidex:2.0.1' - implementation 'androidx.security:security-crypto:1.1.0-alpha06' - implementation 'androidx.work:work-runtime-ktx:2.10.0' + implementation 'androidx.security:security-crypto:1.1.0-alpha07' + implementation 'androidx.work:work-runtime-ktx:2.10.1' implementation 'com.commonsware.cwac:document:0.5.0' implementation 'com.drewnoakes:metadata-extractor:2.19.0' @@ -171,11 +171,11 @@ dependencies { // - https://jitpack.io/p/deckerst/androidsvg // - https://jitpack.io/p/deckerst/mp4parser // - https://jitpack.io/p/deckerst/pixymeta-android - implementation 'com.github.deckerst:Android-TiffBitmapFactory:3ed067f021' - implementation 'com.github.deckerst:androidsvg:cc9d59a88f' - implementation 'com.github.deckerst.mp4parser:isoparser:d5caf7a3dd' - implementation 'com.github.deckerst.mp4parser:muxer:d5caf7a3dd' - implementation 'com.github.deckerst:pixymeta-android:71eee77dc4' + implementation 'com.github.deckerst:Android-TiffBitmapFactory:d6b2b0aa4f' + implementation 'com.github.deckerst:androidsvg:67db933051' + implementation 'com.github.deckerst.mp4parser:isoparser:c2898f1832' + implementation 'com.github.deckerst.mp4parser:muxer:c2898f1832' + implementation 'com.github.deckerst:pixymeta-android:cb1cdc932e' implementation project(':exifinterface') testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.11.4' diff --git a/android/exifinterface/src/main/java/androidx/exifinterface/media/ExifInterfaceFork.java b/android/exifinterface/src/main/java/androidx/exifinterface/media/ExifInterfaceFork.java index 7643c4193..20a8ab593 100644 --- a/android/exifinterface/src/main/java/androidx/exifinterface/media/ExifInterfaceFork.java +++ b/android/exifinterface/src/main/java/androidx/exifinterface/media/ExifInterfaceFork.java @@ -22,7 +22,6 @@ import static androidx.exifinterface.media.ExifInterfaceUtilsFork.convertToLongA import static androidx.exifinterface.media.ExifInterfaceUtilsFork.copy; import static androidx.exifinterface.media.ExifInterfaceUtilsFork.parseSubSeconds; import static androidx.exifinterface.media.ExifInterfaceUtilsFork.startsWith; - import static java.lang.annotation.ElementType.TYPE_USE; import static java.nio.ByteOrder.BIG_ENDIAN; import static java.nio.ByteOrder.LITTLE_ENDIAN; @@ -91,7 +90,7 @@ import java.util.regex.Pattern; import java.util.zip.CRC32; /* - * Forked from 'androidx.exifinterface:exifinterface:1.4.0' + * Forked from 'androidx.exifinterface:exifinterface:1.4.1' * Named differently to let ExifInterface be loaded as subdependency. * cf https://maven.google.com/web/index.html?q=exifinterface#androidx.exifinterface:exifinterface * cf https://github.com/androidx/androidx/tree/androidx-main/exifinterface/exifinterface/src/main/java/androidx/exifinterface/media @@ -4553,7 +4552,7 @@ public class ExifInterfaceFork { && (mXmpFromSeparateMarker != null || !containsTiff700Xmp)) || (xmpHandling == XMP_HANDLING_PREFER_TIFF_700_IF_PRESENT && !containsTiff700Xmp)) { - mXmpFromSeparateMarker = ExifAttribute.createByte(value); + mXmpFromSeparateMarker = value != null ? ExifAttribute.createByte(value) : null; return; } } @@ -6558,8 +6557,9 @@ public class ExifInterfaceFork { // Exif data in WebP images (e.g. // https://github.com/ImageMagick/ImageMagick/issues/3140) if (startsWith(payload, IDENTIFIER_EXIF_APP1)) { - payload = Arrays.copyOfRange(payload, IDENTIFIER_EXIF_APP1.length, - payload.length); + payload = + Arrays.copyOfRange( + payload, IDENTIFIER_EXIF_APP1.length, payload.length); } // Save offset to EXIF data for handling thumbnail and attribute offsets. @@ -6722,8 +6722,11 @@ public class ExifInterfaceFork { copy(dataInputStream, dataOutputStream, PNG_SIGNATURE.length); boolean needToWriteExif = true; - boolean needToWriteXmp = mXmpFromSeparateMarker != null; - while (needToWriteExif || needToWriteXmp) { + // Either there's some XMP data to write, or it has been cleared locally but was present in + // the file when it was read (and so needs to be removed). + boolean needToHandleXmpChunk = + mXmpFromSeparateMarker != null || mFileOnDiskContainsSeparateXmpMarker; + while (needToWriteExif || needToHandleXmpChunk) { int chunkLength = dataInputStream.readInt(); int chunkType = dataInputStream.readInt(); if (chunkType == PNG_CHUNK_TYPE_IHDR) { @@ -6738,7 +6741,7 @@ public class ExifInterfaceFork { } if (mXmpFromSeparateMarker != null && !mFileOnDiskContainsSeparateXmpMarker) { writePngXmpItxtChunk(dataOutputStream); - needToWriteXmp = false; + needToHandleXmpChunk = false; } continue; } else if (chunkType == PNG_CHUNK_TYPE_EXIF && needToWriteExif) { @@ -6746,10 +6749,25 @@ public class ExifInterfaceFork { dataInputStream.skipFully(chunkLength + PNG_CHUNK_CRC_BYTE_LENGTH); needToWriteExif = false; continue; - } else if (chunkType == PNG_CHUNK_TYPE_ITXT && needToWriteXmp) { - writePngXmpItxtChunk(dataOutputStream); - dataInputStream.skipFully(chunkLength + PNG_CHUNK_CRC_BYTE_LENGTH); - needToWriteXmp = false; + } else if (chunkType == PNG_CHUNK_TYPE_ITXT + && chunkLength >= PNG_ITXT_XMP_KEYWORD.length) { + // Read the 17 byte keyword and 5 expected null bytes. + byte[] keyword = new byte[PNG_ITXT_XMP_KEYWORD.length]; + dataInputStream.readFully(keyword); + int remainingChunkBytes = chunkLength - keyword.length + PNG_CHUNK_CRC_BYTE_LENGTH; + if (Arrays.equals(keyword, PNG_ITXT_XMP_KEYWORD)) { + if (mXmpFromSeparateMarker != null) { + writePngXmpItxtChunk(dataOutputStream); + } + dataInputStream.skipFully(remainingChunkBytes); + needToHandleXmpChunk = false; + } else { + // This is a non-XMP iTXt chunk, so just copy it to the output and continue. + dataOutputStream.writeInt(chunkLength); + dataOutputStream.writeInt(chunkType); + dataOutputStream.write(keyword); + copy(dataInputStream, dataOutputStream, remainingChunkBytes); + } continue; } dataOutputStream.writeInt(chunkLength); diff --git a/android/exifinterface/src/main/java/androidx/exifinterface/media/ExifInterfaceUtilsFork.java b/android/exifinterface/src/main/java/androidx/exifinterface/media/ExifInterfaceUtilsFork.java index 301e306fa..266959a5c 100644 --- a/android/exifinterface/src/main/java/androidx/exifinterface/media/ExifInterfaceUtilsFork.java +++ b/android/exifinterface/src/main/java/androidx/exifinterface/media/ExifInterfaceUtilsFork.java @@ -31,7 +31,7 @@ import java.io.InputStream; import java.io.OutputStream; /* - * Forked from 'androidx.exifinterface:exifinterface:1.4.0-alpha01' on 2024/11/17 + * Forked from 'androidx.exifinterface:exifinterface:1.4.1' * Named differently to let ExifInterface be loaded as subdependency. * cf https://github.com/androidx/androidx/tree/androidx-main/exifinterface/exifinterface/src/main/java/androidx/exifinterface/media */