From 962d6b053081d865b78f3a432785e5b3a7a4523e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Muller?= Date: Mon, 2 Sep 2024 07:35:36 +0200 Subject: [PATCH 1/3] Use `kotlinx-datetime` instead of Java APIs --- data/build.gradle.kts | 5 +- .../data/ISO8601DateParser.kt | 46 ------------------- .../integrationlayer/data/ImageUrl.kt | 1 + .../data/remote/BroadCastInformation.kt | 10 ++-- .../integrationlayer/data/remote/Chapter.kt | 18 +++----- .../integrationlayer/data/remote/Episode.kt | 8 +--- .../integrationlayer/data/remote/Media.kt | 12 ++--- .../data/remote/MediaAggregations.kt | 8 +--- .../integrationlayer/data/remote/Program.kt | 14 ++---- .../data/remote/SRGMediaMetadata.kt | 23 ++++++---- .../integrationlayer/data/remote/Section.kt | 10 ++-- .../integrationlayer/data/remote/Segment.kt | 23 ++++------ .../integrationlayer/data/remote/Song.kt | 8 +--- .../data/remote/SpriteSheet.kt | 3 +- .../data/serializer/DateSerializer.kt | 22 --------- .../integrationlayer/data/DateParserTest.kt | 40 ---------------- .../data/TestAspectRatioSerializer.kt | 4 +- .../data/TestBlockReasonSerializer.kt | 4 +- .../data/TestDateSerializer.kt | 29 ------------ .../data/TestImageUrlSerializer.kt | 4 +- gradle/libs.versions.toml | 3 ++ 21 files changed, 64 insertions(+), 231 deletions(-) delete mode 100644 data/src/main/java/ch/srg/dataProvider/integrationlayer/data/ISO8601DateParser.kt delete mode 100644 data/src/main/java/ch/srg/dataProvider/integrationlayer/data/serializer/DateSerializer.kt delete mode 100644 data/src/test/java/ch/srg/dataProvider/integrationlayer/data/DateParserTest.kt delete mode 100644 data/src/test/java/ch/srg/dataProvider/integrationlayer/data/TestDateSerializer.kt diff --git a/data/build.gradle.kts b/data/build.gradle.kts index 821209c..8981b5e 100644 --- a/data/build.gradle.kts +++ b/data/build.gradle.kts @@ -52,11 +52,10 @@ android { } dependencies { + api(libs.kotlinx.datetime) api(libs.kotlinx.serialization.json) - testRuntimeOnly(libs.robolectric) - testImplementation(libs.junit) - testImplementation(libs.androidx.test.ext.junit) + testImplementation(libs.kotlin.test) } publishing { diff --git a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/ISO8601DateParser.kt b/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/ISO8601DateParser.kt deleted file mode 100644 index f834d36..0000000 --- a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/ISO8601DateParser.kt +++ /dev/null @@ -1,46 +0,0 @@ -package ch.srg.dataProvider.integrationlayer.data - -import java.text.ParseException -import java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale - -/** - * DateParser to convert Integration Layer String date to date (ISO_8601) - * - * DateParser isn't Thread Safe, each thread must use its own instance. - * Because SimpleDateFormat isn't Thread Safe @link(https://developer.android.com/reference/java/text/SimpleDateFormat) - * - * - * Copyright (c) SRG SSR. All rights reserved. - * - * - * License information is available from the LICENSE file. - */ -class ISO8601DateParser { - // SimpleDateFormat use Object that aren't thread-safe, what may lead to IndexOutOfBoundException. - private val sdf: SimpleDateFormat = SimpleDateFormat(ISO_8601_FORMAT, Locale.US) - - @Throws(ParseException::class) - fun parseDate(s: String): Date { - val fixed = fix8601ForSimpleDateFormat(s) - return sdf.parse(fixed) ?: throw ParseException("Can't parse $s", 0) - } - - fun format(date: Date): String { - return sdf.format(date) - } - - companion object { - const val ISO_8601_FORMAT = "yyyy-MM-dd'T'HH:mm:ssZZZZZ" - - fun fix8601ForSimpleDateFormat(s: String): String { - var output = s - if (output.endsWith("Z")) { - output = output.substring(0, output.length - 1) + "+00:00" - } - output = output.replace("\\.\\d+".toRegex(), "") - return output - } - } -} diff --git a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/ImageUrl.kt b/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/ImageUrl.kt index 790d8ce..2cca03e 100644 --- a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/ImageUrl.kt +++ b/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/ImageUrl.kt @@ -16,6 +16,7 @@ import java.io.Serializable */ @Suppress("SerialVersionUIDInSerializableClass") @kotlinx.serialization.Serializable(with = ImageUrlSerializer::class) +// TODO Why is this class 'java.io.Serializable'? data class ImageUrl( /** * Only for internal use! Please use a Decorator! diff --git a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/BroadCastInformation.kt b/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/BroadCastInformation.kt index d7fa551..6b3f05a 100644 --- a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/BroadCastInformation.kt +++ b/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/BroadCastInformation.kt @@ -1,11 +1,7 @@ -@file:UseSerializers(DateSerializer::class) - package ch.srg.dataProvider.integrationlayer.data.remote -import ch.srg.dataProvider.integrationlayer.data.serializer.DateSerializer +import kotlinx.datetime.Instant import kotlinx.serialization.Serializable -import kotlinx.serialization.UseSerializers -import java.util.Date /** * Copyright (c) SRG SSR. All rights reserved. @@ -17,6 +13,6 @@ import java.util.Date data class BroadCastInformation( val hintText: String? = null, val url: String? = null, - val startDate: Date? = null, - val endDate: Date? = null + val startDate: Instant? = null, + val endDate: Instant? = null ) diff --git a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/Chapter.kt b/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/Chapter.kt index 8b31859..c61b6ed 100644 --- a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/Chapter.kt +++ b/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/Chapter.kt @@ -1,13 +1,9 @@ -@file:UseSerializers(DateSerializer::class) - package ch.srg.dataProvider.integrationlayer.data.remote import ch.srg.dataProvider.integrationlayer.data.ImageUrl -import ch.srg.dataProvider.integrationlayer.data.serializer.DateSerializer +import kotlinx.datetime.Instant import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import kotlinx.serialization.UseSerializers -import java.util.Date /** * Copyright (c) SRG SSR. All rights reserved. @@ -29,12 +25,12 @@ data class Chapter( override val blockReason: BlockReason? = null, override val youthProtectionColor: YouthProtectionColor? = null, override val type: Type, - override val date: Date, + override val date: Instant, override val duration: Long, override val podcastSdUrl: String? = null, override val podcastHdUrl: String? = null, - override val validFrom: Date? = null, - override val validTo: Date? = null, + override val validFrom: Instant? = null, + override val validTo: Instant? = null, override val assignedBy: Referrer? = null, override val playableAbroad: Boolean = false, override val relatedContentList: List? = null, @@ -53,14 +49,14 @@ data class Chapter( val segmentList: List? = null, val resourceList: List? = null, val spriteSheet: SpriteSheet? = null, - val preTrailerStart: Date? = null, - val postTrailerStart: Date? = null, + val preTrailerStart: Instant? = null, + val postTrailerStart: Instant? = null, /** * The reference date corresponding to the beginning of the stream, if any. You can use this date to map a time * position relative to the stream (e.g., a segment mark in or mark out) to a date. */ @SerialName("dvrReferenceDate") - val resourceReferenceDate: Date? = null, + val resourceReferenceDate: Instant? = null, val timeIntervalList: List? = null, override val imageFocalPoint: FocalPoint? = null diff --git a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/Episode.kt b/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/Episode.kt index 9ae0fdd..b12cd88 100644 --- a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/Episode.kt +++ b/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/Episode.kt @@ -1,12 +1,8 @@ -@file:UseSerializers(DateSerializer::class) - package ch.srg.dataProvider.integrationlayer.data.remote import ch.srg.dataProvider.integrationlayer.data.ImageUrl -import ch.srg.dataProvider.integrationlayer.data.serializer.DateSerializer +import kotlinx.datetime.Instant import kotlinx.serialization.Serializable -import kotlinx.serialization.UseSerializers -import java.util.Date /** * Copyright (c) SRG SSR. All rights reserved. @@ -22,7 +18,7 @@ data class Episode( override val description: String? = null, override val imageTitle: String? = null, override val imageCopyright: String? = null, - val publishedDate: Date? = null, + val publishedDate: Instant? = null, val fullLengthUrn: String? = null, val seasonNumber: Int? = null, val number: Int? = null, diff --git a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/Media.kt b/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/Media.kt index a54525c..55e483a 100644 --- a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/Media.kt +++ b/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/Media.kt @@ -1,13 +1,9 @@ -@file:UseSerializers(DateSerializer::class) - package ch.srg.dataProvider.integrationlayer.data.remote import ch.srg.dataProvider.integrationlayer.data.ImageUrl -import ch.srg.dataProvider.integrationlayer.data.serializer.DateSerializer +import kotlinx.datetime.Instant import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import kotlinx.serialization.UseSerializers -import java.util.Date /** * Copyright (c) SRG SSR. All rights reserved. @@ -22,7 +18,7 @@ data class Media( override val urn: String, override val title: String, override val type: Type, - override val date: Date, + override val date: Instant, override val duration: Long, override val imageUrl: ImageUrl, override val imageFocalPoint: FocalPoint? = null, @@ -34,8 +30,8 @@ data class Media( override val youthProtectionColor: YouthProtectionColor? = null, override val podcastSdUrl: String? = null, override val podcastHdUrl: String? = null, - override val validFrom: Date? = null, - override val validTo: Date? = null, + override val validFrom: Instant? = null, + override val validTo: Instant? = null, override val assignedBy: Referrer? = null, override val playableAbroad: Boolean, override val relatedContentList: List? = null, diff --git a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/MediaAggregations.kt b/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/MediaAggregations.kt index fc3f930..897608f 100644 --- a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/MediaAggregations.kt +++ b/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/MediaAggregations.kt @@ -1,11 +1,7 @@ -@file:UseSerializers(DateSerializer::class) - package ch.srg.dataProvider.integrationlayer.data.remote -import ch.srg.dataProvider.integrationlayer.data.serializer.DateSerializer +import kotlinx.datetime.Instant import kotlinx.serialization.Serializable -import kotlinx.serialization.UseSerializers -import java.util.Date /** * Copyright (c) SRG SSR. All rights reserved. @@ -42,7 +38,7 @@ data class ShowBucket(val urn: String, val title: String, override val count: In data class DurationInMinutesBucket(val duration: Long, override val count: Int) : Bucket @Serializable -data class DateBucket(val date: Date, override val count: Int) : Bucket +data class DateBucket(val date: Instant, override val count: Int) : Bucket @Serializable data class MediaAggregations( diff --git a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/Program.kt b/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/Program.kt index 19c881d..11166ca 100644 --- a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/Program.kt +++ b/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/Program.kt @@ -1,13 +1,9 @@ -@file:UseSerializers(DateSerializer::class) - package ch.srg.dataProvider.integrationlayer.data.remote import ch.srg.dataProvider.integrationlayer.data.ImageUrl -import ch.srg.dataProvider.integrationlayer.data.serializer.DateSerializer +import kotlinx.datetime.Instant import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import kotlinx.serialization.UseSerializers -import java.util.Date /** * Copyright (c) SRG SSR. All rights reserved. @@ -17,8 +13,8 @@ import java.util.Date @Serializable data class Program( override val title: String, - val startTime: Date, - val endTime: Date, + val startTime: Instant, + val endTime: Instant, override val lead: String? = null, override val description: String? = null, val imageUrl: ImageUrl? = null, @@ -56,8 +52,8 @@ data class Program( val channelUrn: String? = null ) : SRGMetadata { - fun isDateInProgramTime(date: Date): Boolean { - return date.after(startTime) && date.before(endTime) + fun isDateInProgramTime(instant: Instant): Boolean { + return instant > startTime && instant < endTime } } diff --git a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/SRGMediaMetadata.kt b/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/SRGMediaMetadata.kt index 8a8d523..2795a9c 100644 --- a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/SRGMediaMetadata.kt +++ b/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/SRGMediaMetadata.kt @@ -1,6 +1,7 @@ package ch.srg.dataProvider.integrationlayer.data.remote -import java.util.Date +import kotlinx.datetime.Clock +import kotlinx.datetime.Instant /** * Copyright (c) SRG SSR. All rights reserved. @@ -10,11 +11,11 @@ import java.util.Date interface SRGMediaMetadata : SRGIdentifierMetadata, SRGImageMetadata, SRGMetadata { val mediaType: MediaType val type: Type - val date: Date + val date: Instant val duration: Long val blockReason: BlockReason? - val validFrom: Date? - val validTo: Date? + val validFrom: Instant? + val validTo: Instant? val assignedBy: Referrer? val playableAbroad: Boolean val youthProtectionColor: YouthProtectionColor? @@ -34,26 +35,28 @@ interface SRGMediaMetadata : SRGIdentifierMetadata, SRGImageMetadata, SRGMetadat /** * isBlocked if it has a blockReason or blocked by TimeAvailability at a given time */ - fun isBlocked(at: Date = Date()): Boolean { + fun isBlocked(at: Instant = Clock.System.now()): Boolean { return blockReason != null || getTimeAvailability(at) != TimeAvailability.AVAILABLE } - fun getTimeAvailability(at: Date = Date()): TimeAvailability { + fun getTimeAvailability(at: Instant = Clock.System.now()): TimeAvailability { + val validTo = validTo + val validFrom = validFrom return when { blockReason == BlockReason.STARTDATE -> TimeAvailability.NOT_YET_AVAILABLE blockReason == BlockReason.ENDDATE -> TimeAvailability.NOT_AVAILABLE_ANYMORE - validTo != null && at.after(validTo) -> TimeAvailability.NOT_AVAILABLE_ANYMORE - validFrom != null && at.before(validFrom) -> TimeAvailability.NOT_YET_AVAILABLE + validTo != null && at > validTo -> TimeAvailability.NOT_AVAILABLE_ANYMORE + validFrom != null && at < validFrom -> TimeAvailability.NOT_YET_AVAILABLE else -> TimeAvailability.AVAILABLE } } fun isBlockedValidFromTime(currentTime: Long = System.currentTimeMillis()): Boolean { - return validFrom != null && validFrom!!.time > currentTime + return validFrom != null && validFrom!!.toEpochMilliseconds() > currentTime } fun isBlockValidToTime(currentTime: Long = System.currentTimeMillis()): Boolean { - return validTo != null && currentTime > validTo!!.time + return validTo != null && currentTime > validTo!!.toEpochMilliseconds() } fun isTimeBlocked(currentTime: Long): Boolean { diff --git a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/Section.kt b/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/Section.kt index b974f06..268a7cc 100644 --- a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/Section.kt +++ b/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/Section.kt @@ -1,12 +1,8 @@ -@file:UseSerializers(DateSerializer::class) - package ch.srg.dataProvider.integrationlayer.data.remote -import ch.srg.dataProvider.integrationlayer.data.serializer.DateSerializer +import kotlinx.datetime.Instant import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import kotlinx.serialization.UseSerializers -import java.util.Date /** * Copyright (c) SRG SSR. All rights reserved. @@ -22,8 +18,8 @@ data class Section( val representation: Representation, val isPublished: Boolean, @SerialName("start") - val startDate: Date? = null, + val startDate: Instant? = null, @SerialName("end") - val endDate: Date? = null, + val endDate: Instant? = null, val hasPersonalizedContent: Boolean? = null, ) : ILObject diff --git a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/Segment.kt b/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/Segment.kt index b262d51..24584a1 100644 --- a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/Segment.kt +++ b/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/Segment.kt @@ -1,13 +1,10 @@ -@file:UseSerializers(DateSerializer::class) - package ch.srg.dataProvider.integrationlayer.data.remote import ch.srg.dataProvider.integrationlayer.data.ImageUrl -import ch.srg.dataProvider.integrationlayer.data.serializer.DateSerializer +import kotlinx.datetime.Instant import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable -import kotlinx.serialization.UseSerializers -import java.util.Date +import kotlin.time.Duration.Companion.milliseconds /** * Copyright (c) SRG SSR. All rights reserved. @@ -30,7 +27,7 @@ data class Segment @JvmOverloads constructor( */ val markOut: Long, override val type: Type, - override val date: Date, + override val date: Instant, override val duration: Long, override val displayable: Boolean, override val playableAbroad: Boolean, @@ -44,8 +41,8 @@ data class Segment @JvmOverloads constructor( override val youthProtectionColor: YouthProtectionColor? = null, override val podcastSdUrl: String? = null, override val podcastHdUrl: String? = null, - override val validFrom: Date? = null, - override val validTo: Date? = null, + override val validFrom: Instant? = null, + override val validTo: Instant? = null, override val assignedBy: Referrer? = null, override val relatedContentList: List? = null, override val socialCountList: List? = null, @@ -65,23 +62,23 @@ data class Segment @JvmOverloads constructor( * The date corresponding to the mark in time, `null` if no such relationship exists. * @see resourceReferenceDate */ - var markInDate: Date? = null + var markInDate: Instant? = null /** * The date corresponding to the mark out time, `null` if no such relationship exists. * @see resourceReferenceDate */ - var markOutDate: Date? = null + var markOutDate: Instant? = null /** * Reference date to compute mark in and mark out date, `null` if no such relationship exists. */ - var resourceReferenceDate: Date? = null + var resourceReferenceDate: Instant? = null set(value) { field = value if (value != null) { - markInDate = Date(value.time + markIn) - markOutDate = Date(value.time + markOut) + markInDate = value + markIn.milliseconds + markOutDate = value + markOut.milliseconds } else { markInDate = null markOutDate = null diff --git a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/Song.kt b/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/Song.kt index 4dd547f..d3a19c2 100644 --- a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/Song.kt +++ b/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/Song.kt @@ -1,12 +1,8 @@ -@file:UseSerializers(DateSerializer::class) - package ch.srg.dataProvider.integrationlayer.data.remote import ch.srg.dataProvider.integrationlayer.data.ImageUrl -import ch.srg.dataProvider.integrationlayer.data.serializer.DateSerializer +import kotlinx.datetime.Instant import kotlinx.serialization.Serializable -import kotlinx.serialization.UseSerializers -import java.util.Date /** * Copyright (c) SRG SSR. All rights reserved. @@ -16,7 +12,7 @@ import java.util.Date @Serializable data class Song( val isPlayingNow: Boolean, - val date: Date, + val date: Instant, val title: String, val artist: Artist, val duration: Int? = null, diff --git a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/SpriteSheet.kt b/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/SpriteSheet.kt index 0abe659..b655f4e 100644 --- a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/SpriteSheet.kt +++ b/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/remote/SpriteSheet.kt @@ -1,6 +1,5 @@ package ch.srg.dataProvider.integrationlayer.data.remote -import android.util.Rational import kotlinx.serialization.Serializable import kotlinx.serialization.Transient @@ -23,5 +22,5 @@ data class SpriteSheet( val count: Int = rows * columns @Transient - val aspectRatio = Rational(thumbnailWidth, thumbnailHeight) + val aspectRatio = AspectRatio(thumbnailWidth, thumbnailHeight) } diff --git a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/serializer/DateSerializer.kt b/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/serializer/DateSerializer.kt deleted file mode 100644 index e3efcb4..0000000 --- a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/serializer/DateSerializer.kt +++ /dev/null @@ -1,22 +0,0 @@ -package ch.srg.dataProvider.integrationlayer.data.serializer - -import ch.srg.dataProvider.integrationlayer.data.ISO8601DateParser -import kotlinx.serialization.KSerializer -import kotlinx.serialization.descriptors.PrimitiveKind -import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor -import kotlinx.serialization.encoding.Decoder -import kotlinx.serialization.encoding.Encoder -import java.util.Date - -class DateSerializer : KSerializer { - override val descriptor = PrimitiveSerialDescriptor("Date", PrimitiveKind.STRING) - - override fun deserialize(decoder: Decoder): Date { - val string = decoder.decodeString() - return ISO8601DateParser().parseDate(string) - } - - override fun serialize(encoder: Encoder, value: Date) { - encoder.encodeString(ISO8601DateParser().format(value)) - } -} diff --git a/data/src/test/java/ch/srg/dataProvider/integrationlayer/data/DateParserTest.kt b/data/src/test/java/ch/srg/dataProvider/integrationlayer/data/DateParserTest.kt deleted file mode 100644 index 8d1f949..0000000 --- a/data/src/test/java/ch/srg/dataProvider/integrationlayer/data/DateParserTest.kt +++ /dev/null @@ -1,40 +0,0 @@ -package ch.srg.dataProvider.integrationlayer.data - -import androidx.test.ext.junit.runners.AndroidJUnit4 -import org.junit.Assert -import org.junit.Ignore -import org.junit.Test -import org.junit.runner.RunWith -import java.text.ParseException -import java.util.Date - -/** - * [Testing Fundamentals](http://d.android.com/tools/testing/testing_android.html) - */ -@RunWith(AndroidJUnit4::class) -class DateParserTest { - - @Ignore("robolectric date parsing doesn't use same format") - @Test - fun test8601() { - val parser = ISO8601DateParser() - Assert.assertEquals(Date(1496126175000L), parser.parseDate("2017-05-30T08:36:15.079+02:00")) - Assert.assertEquals(Date(1496126175000L), parser.parseDate("2017-05-30T08:36:15+02:00")) - Assert.assertEquals(Date(1496126175000L), parser.parseDate("2017-05-30T06:36:15Z")) - } - - @Test(expected = ParseException::class) - fun testEmptyString() { - ISO8601DateParser().parseDate("") - } - - @Test(expected = ParseException::class) - fun testInvalidString() { - ISO8601DateParser().parseDate("Not_Date") - } - - @Test(expected = ParseException::class) - fun testInvalidDateString() { - ISO8601DateParser().parseDate("2017-05-30AB08:36:15.079+02:00") - } -} diff --git a/data/src/test/java/ch/srg/dataProvider/integrationlayer/data/TestAspectRatioSerializer.kt b/data/src/test/java/ch/srg/dataProvider/integrationlayer/data/TestAspectRatioSerializer.kt index 41f5f09..274df94 100644 --- a/data/src/test/java/ch/srg/dataProvider/integrationlayer/data/TestAspectRatioSerializer.kt +++ b/data/src/test/java/ch/srg/dataProvider/integrationlayer/data/TestAspectRatioSerializer.kt @@ -2,8 +2,8 @@ package ch.srg.dataProvider.integrationlayer.data import ch.srg.dataProvider.integrationlayer.data.remote.AspectRatio import kotlinx.serialization.encodeToString -import org.junit.Assert.assertEquals -import org.junit.Test +import kotlin.test.Test +import kotlin.test.assertEquals class TestAspectRatioSerializer { diff --git a/data/src/test/java/ch/srg/dataProvider/integrationlayer/data/TestBlockReasonSerializer.kt b/data/src/test/java/ch/srg/dataProvider/integrationlayer/data/TestBlockReasonSerializer.kt index 22d5ac8..95564ed 100644 --- a/data/src/test/java/ch/srg/dataProvider/integrationlayer/data/TestBlockReasonSerializer.kt +++ b/data/src/test/java/ch/srg/dataProvider/integrationlayer/data/TestBlockReasonSerializer.kt @@ -2,8 +2,8 @@ package ch.srg.dataProvider.integrationlayer.data import ch.srg.dataProvider.integrationlayer.data.remote.BlockReason import kotlinx.serialization.encodeToString -import org.junit.Assert.assertEquals -import org.junit.Test +import kotlin.test.Test +import kotlin.test.assertEquals class TestBlockReasonSerializer { diff --git a/data/src/test/java/ch/srg/dataProvider/integrationlayer/data/TestDateSerializer.kt b/data/src/test/java/ch/srg/dataProvider/integrationlayer/data/TestDateSerializer.kt deleted file mode 100644 index a7b4391..0000000 --- a/data/src/test/java/ch/srg/dataProvider/integrationlayer/data/TestDateSerializer.kt +++ /dev/null @@ -1,29 +0,0 @@ -package ch.srg.dataProvider.integrationlayer.data - -import androidx.test.ext.junit.runners.AndroidJUnit4 -import ch.srg.dataProvider.integrationlayer.data.serializer.DateSerializer -import org.junit.Assert -import org.junit.Ignore -import org.junit.Test -import org.junit.runner.RunWith -import java.util.Date - -@RunWith(AndroidJUnit4::class) -class TestDateSerializer { - - @Ignore("robolectric date parsing doesn't use same format") - @Test - fun testToJSon() { - val expectedJson = "\"2017-05-30T08:36:15+02:00\"" - val input = Date(1496126175000L) - Assert.assertEquals(expectedJson, DataProviderJson.encodeToString(serializer = DateSerializer(), input)) - } - - @Ignore("robolectric date parsing doesn't use same format") - @Test - fun testFromJson() { - val input = "\"2017-05-30T08:36:15+02:00\"" - val expectedDate = Date(1496126175000L) - Assert.assertEquals(expectedDate, DataProviderJson.decodeFromString(deserializer = DateSerializer(), input)) - } -} diff --git a/data/src/test/java/ch/srg/dataProvider/integrationlayer/data/TestImageUrlSerializer.kt b/data/src/test/java/ch/srg/dataProvider/integrationlayer/data/TestImageUrlSerializer.kt index 9d42b54..b552930 100644 --- a/data/src/test/java/ch/srg/dataProvider/integrationlayer/data/TestImageUrlSerializer.kt +++ b/data/src/test/java/ch/srg/dataProvider/integrationlayer/data/TestImageUrlSerializer.kt @@ -1,8 +1,8 @@ package ch.srg.dataProvider.integrationlayer.data import kotlinx.serialization.encodeToString -import org.junit.Assert.assertEquals -import org.junit.Test +import kotlin.test.Test +import kotlin.test.assertEquals class TestImageUrlSerializer { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1879561..5998b40 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -7,6 +7,7 @@ androidx-test-ext-junit = "1.2.1" detekt = "1.23.6" junit = "4.13.2" kotlin = "2.0.20" +kotlinx-datetime = "0.6.1" kotlinx-serialization = "1.7.2" okhttp = "4.12.0" retrofit = "2.11.0" @@ -19,6 +20,8 @@ androidx-paging-common = { module = "androidx.paging:paging-common", version.ref androidx-test-ext-junit = { module = "androidx.test.ext:junit", version.ref = "androidx-test-ext-junit" } detekt-formatting = { module = "io.gitlab.arturbosch.detekt:detekt-formatting", version.ref = "detekt" } junit = { module = "junit:junit", version.ref = "junit" } +kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } +kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "kotlinx-datetime" } kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinx-serialization" } okhttp-logging-interceptor = { module = "com.squareup.okhttp3:logging-interceptor", version.ref = "okhttp" } retrofit = { module = "com.squareup.retrofit2:retrofit" } From 3f35c07027e45bc451a7067ff5388cbf75b09fb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Muller?= Date: Tue, 3 Sep 2024 11:41:53 +0200 Subject: [PATCH 2/3] Remove `java.io.Serializable` from `ImageUrl` --- .../srg/dataProvider/integrationlayer/data/ImageUrl.kt | 10 +++------- .../integrationlayer/request/parameters/IlDate.kt | 4 ++++ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/ImageUrl.kt b/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/ImageUrl.kt index 2cca03e..8d7228b 100644 --- a/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/ImageUrl.kt +++ b/data/src/main/java/ch/srg/dataProvider/integrationlayer/data/ImageUrl.kt @@ -7,24 +7,20 @@ package ch.srg.dataProvider.integrationlayer.data import ch.srg.dataProvider.integrationlayer.data.serializer.ImageUrlSerializer -import java.io.Serializable +import kotlinx.serialization.Serializable /** * Image url * * @property rawUrl Internal image url, to retrieve the url use [ImageUrl.decorated]. */ -@Suppress("SerialVersionUIDInSerializableClass") -@kotlinx.serialization.Serializable(with = ImageUrlSerializer::class) -// TODO Why is this class 'java.io.Serializable'? +@Serializable(with = ImageUrlSerializer::class) data class ImageUrl( /** - * Only for internal use! Please use a Decorator! - * * @return the undecorated url */ val rawUrl: String -) : Serializable { +) { /** * Decorated diff --git a/dataprovider-retrofit/src/main/java/ch/srg/dataProvider/integrationlayer/request/parameters/IlDate.kt b/dataprovider-retrofit/src/main/java/ch/srg/dataProvider/integrationlayer/request/parameters/IlDate.kt index a8fa60d..5b406ee 100644 --- a/dataprovider-retrofit/src/main/java/ch/srg/dataProvider/integrationlayer/request/parameters/IlDate.kt +++ b/dataprovider-retrofit/src/main/java/ch/srg/dataProvider/integrationlayer/request/parameters/IlDate.kt @@ -1,5 +1,7 @@ package ch.srg.dataProvider.integrationlayer.request.parameters +import kotlinx.datetime.Clock +import kotlinx.datetime.Instant import java.text.SimpleDateFormat import java.util.Calendar import java.util.Date @@ -16,6 +18,8 @@ import java.util.TimeZone class IlDate(date: Date = Date()) : IlParam(formatDate(date)) { constructor(calendar: Calendar) : this(calendar.time) + constructor(instant: Instant = Clock.System.now()) : this(Date(instant.toEpochMilliseconds())) + /** * months = [0-11] * days = [0-30] From f3ca14c9aa002e4d4468d2a0d76d196bbd1bf1d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABtan=20Muller?= Date: Wed, 4 Sep 2024 13:51:41 +0200 Subject: [PATCH 3/3] Add `com.android.tools:desugar_jdk_libs` --- data/build.gradle.kts | 2 ++ dataproviderdemo/build.gradle.kts | 2 ++ gradle/libs.versions.toml | 2 ++ 3 files changed, 6 insertions(+) diff --git a/data/build.gradle.kts b/data/build.gradle.kts index 8981b5e..6a4a897 100644 --- a/data/build.gradle.kts +++ b/data/build.gradle.kts @@ -30,6 +30,7 @@ android { } compileOptions { + isCoreLibraryDesugaringEnabled = true sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } @@ -54,6 +55,7 @@ android { dependencies { api(libs.kotlinx.datetime) api(libs.kotlinx.serialization.json) + coreLibraryDesugaring(libs.android.desugar.jdk.libs) testImplementation(libs.kotlin.test) } diff --git a/dataproviderdemo/build.gradle.kts b/dataproviderdemo/build.gradle.kts index 78915a4..e47eeed 100644 --- a/dataproviderdemo/build.gradle.kts +++ b/dataproviderdemo/build.gradle.kts @@ -37,6 +37,7 @@ android { } compileOptions { + isCoreLibraryDesugaringEnabled = true sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } @@ -59,4 +60,5 @@ dependencies { implementation(project(":dataprovider-retrofit")) implementation(libs.androidx.activity) implementation(libs.androidx.lifecycle.runtime) + coreLibraryDesugaring(libs.android.desugar.jdk.libs) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5998b40..5a20ec3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,4 +1,5 @@ [versions] +android-desugar-jdk-libs = "2.1.2" android-gradle-plugin = "8.6.0" androidx-activity = "1.9.1" androidx-lifecycle = "2.8.4" @@ -14,6 +15,7 @@ retrofit = "2.11.0" robolectric = "4.13" [libraries] +android-desugar-jdk-libs = { module = "com.android.tools:desugar_jdk_libs", version.ref = "android-desugar-jdk-libs" } androidx-activity = { module = "androidx.activity:activity", version.ref = "androidx-activity" } androidx-lifecycle-runtime = { module = "androidx.lifecycle:lifecycle-runtime", version.ref = "androidx-lifecycle" } androidx-paging-common = { module = "androidx.paging:paging-common", version.ref = "androidx-paging" }