From 94647a928bfd7ac15fddbb5b0405f658d1d69f8f Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Sun, 14 May 2023 16:07:59 +0200 Subject: [PATCH] #637 fixed writing incorrect OffsetTime tag when timezone is negative --- .../aves/model/provider/ImageProvider.kt | 16 +++++++++++----- .../aves/model/provider/ImageProviderTest.kt | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 android/app/src/test/kotlin/deckers/thibault/aves/model/provider/ImageProviderTest.kt diff --git a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProvider.kt b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProvider.kt index c6b825258..ac1624c5b 100644 --- a/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProvider.kt +++ b/android/app/src/main/kotlin/deckers/thibault/aves/model/provider/ImageProvider.kt @@ -52,6 +52,7 @@ import pixy.meta.meta.MetadataType import java.io.* import java.nio.channels.Channels import java.util.* +import kotlin.math.absoluteValue abstract class ImageProvider { open fun fetchSingle(context: Context, uri: Uri, sourceMimeType: String?, callback: ImageOpCallback) { @@ -538,11 +539,7 @@ abstract class ImageProvider { exif.setAttribute(ExifInterface.TAG_DATETIME, dateString) exif.setAttribute(ExifInterface.TAG_DATETIME_ORIGINAL, dateString) - val offsetInMinutes = TimeZone.getDefault().getOffset(dateTimeMillis) / 60000 - val offsetSign = if (offsetInMinutes < 0) "-" else "+" - val offsetHours = "${offsetInMinutes / 60}".padStart(2, '0') - val offsetMinutes = "${offsetInMinutes % 60}".padStart(2, '0') - val timeZoneString = "$offsetSign$offsetHours:$offsetMinutes" + val timeZoneString = getTimeZoneString(TimeZone.getDefault(), dateTimeMillis) exif.setAttribute(ExifInterface.TAG_OFFSET_TIME, timeZoneString) exif.setAttribute(ExifInterface.TAG_OFFSET_TIME_ORIGINAL, timeZoneString) @@ -1387,6 +1384,15 @@ abstract class ImageProvider { false } } + + fun getTimeZoneString(timeZone: TimeZone, dateTimeMillis: Long): String { + val offset = timeZone.getOffset(dateTimeMillis) + val offsetInMinutes = offset.absoluteValue / 60000 + val offsetSign = if (offset < 0) "-" else "+" + val offsetHours = "${offsetInMinutes / 60}".padStart(2, '0') + val offsetMinutes = "${offsetInMinutes % 60}".padStart(2, '0') + return "$offsetSign$offsetHours:$offsetMinutes" + } } } diff --git a/android/app/src/test/kotlin/deckers/thibault/aves/model/provider/ImageProviderTest.kt b/android/app/src/test/kotlin/deckers/thibault/aves/model/provider/ImageProviderTest.kt new file mode 100644 index 000000000..705503c62 --- /dev/null +++ b/android/app/src/test/kotlin/deckers/thibault/aves/model/provider/ImageProviderTest.kt @@ -0,0 +1,18 @@ +package deckers.thibault.aves.model.provider + +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test +import java.time.LocalDate +import java.time.Month +import java.util.TimeZone + +class ImageProviderTest { + @Test + fun imageProvider_CorrectEmailSimple_ReturnsTrue() { + val date = LocalDate.of(1990, Month.FEBRUARY, 11).toEpochDay() + assertEquals(ImageProvider.getTimeZoneString(TimeZone.getTimeZone("Europe/Paris"), date), "+01:00") + assertEquals(ImageProvider.getTimeZoneString(TimeZone.getTimeZone("UTC"), date), "+00:00") + assertEquals(ImageProvider.getTimeZoneString(TimeZone.getTimeZone("Asia/Kolkata"), date), "+05:30") + assertEquals(ImageProvider.getTimeZoneString(TimeZone.getTimeZone("America/Chicago"), date), "-06:00") + } +}