diff --git a/app/core/build.gradle.kts b/app/core/build.gradle.kts index 7a91562f7..4df731211 100644 --- a/app/core/build.gradle.kts +++ b/app/core/build.gradle.kts @@ -27,10 +27,15 @@ android { aidl = true buildConfig = true } + + compileOptions { + isCoreLibraryDesugaringEnabled = true + } } dependencies { api(project(":shared")) + coreLibraryDesugaring(libs.jdk.libs) api(libs.timber) api(libs.markwon.core) diff --git a/app/core/src/main/java/com/topjohnwu/magisk/core/ktx/XJVM.kt b/app/core/src/main/java/com/topjohnwu/magisk/core/ktx/XJVM.kt index 23ef9eaec..cebd3b74f 100644 --- a/app/core/src/main/java/com/topjohnwu/magisk/core/ktx/XJVM.kt +++ b/app/core/src/main/java/com/topjohnwu/magisk/core/ktx/XJVM.kt @@ -14,10 +14,11 @@ import java.io.IOException import java.io.InputStream import java.io.OutputStream import java.lang.reflect.Field -import java.text.DateFormat -import java.text.SimpleDateFormat +import java.time.Instant +import java.time.ZoneId +import java.time.format.DateTimeFormatter +import java.time.format.FormatStyle import java.util.Collections -import java.util.Locale inline fun withInOut( input: In, @@ -83,19 +84,15 @@ inline fun Flow.concurrentMap(crossinline transform: suspend (T) -> R) } } -fun Long.toTime(format: DateFormat) = format.format(this).orEmpty() +fun Long.toTime(format: DateTimeFormatter): String = format.format(Instant.ofEpochMilli(this)) // Some devices don't allow filenames containing ":" -val timeFormatStandard by lazy { - SimpleDateFormat( - "yyyy-MM-dd'T'HH.mm.ss", - Locale.ROOT - ) +val timeFormatStandard: DateTimeFormatter by lazy { + DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH.mm.ss").withZone(ZoneId.systemDefault()) } -val timeDateFormat: DateFormat by lazy { - DateFormat.getDateTimeInstance( - DateFormat.DEFAULT, - DateFormat.DEFAULT, - Locale.ROOT - ) +val timeDateFormat: DateTimeFormatter by lazy { + DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM).withZone(ZoneId.systemDefault()) +} +val dateFormat: DateTimeFormatter by lazy { + DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).withZone(ZoneId.systemDefault()) } diff --git a/app/core/src/main/java/com/topjohnwu/magisk/core/model/UpdateInfo.kt b/app/core/src/main/java/com/topjohnwu/magisk/core/model/UpdateInfo.kt index 0470e8900..68b3632cb 100644 --- a/app/core/src/main/java/com/topjohnwu/magisk/core/model/UpdateInfo.kt +++ b/app/core/src/main/java/com/topjohnwu/magisk/core/model/UpdateInfo.kt @@ -7,8 +7,7 @@ import com.squareup.moshi.JsonClass import com.squareup.moshi.JsonQualifier import com.squareup.moshi.ToJson import kotlinx.parcelize.Parcelize -import java.time.LocalDateTime -import java.time.format.DateTimeFormatter.ISO_OFFSET_DATE_TIME +import java.time.Instant @JsonClass(generateAdapter = true) class UpdateJson( @@ -40,13 +39,13 @@ data class ReleaseAssets( class DateTimeAdapter { @ToJson - fun toJson(date: LocalDateTime): String { + fun toJson(date: Instant): String { return date.toString() } @FromJson - fun fromJson(date: String): LocalDateTime { - return LocalDateTime.parse(date, ISO_OFFSET_DATE_TIME) + fun fromJson(date: String): Instant { + return Instant.parse(date) } } @@ -57,7 +56,7 @@ data class Release( val prerelease: Boolean, val assets: List, val body: String, - @Json(name = "created_at") val createdTime: LocalDateTime, + @Json(name = "created_at") val createdTime: Instant, ) { val versionCode: Int get() { return if (tag[0] == 'v') { diff --git a/app/core/src/main/java/com/topjohnwu/magisk/core/repository/NetworkService.kt b/app/core/src/main/java/com/topjohnwu/magisk/core/repository/NetworkService.kt index 183755f85..54f9809a5 100644 --- a/app/core/src/main/java/com/topjohnwu/magisk/core/repository/NetworkService.kt +++ b/app/core/src/main/java/com/topjohnwu/magisk/core/repository/NetworkService.kt @@ -10,13 +10,13 @@ import com.topjohnwu.magisk.core.Config.Value.STABLE_CHANNEL import com.topjohnwu.magisk.core.Info import com.topjohnwu.magisk.core.data.GithubApiServices import com.topjohnwu.magisk.core.data.RawUrl +import com.topjohnwu.magisk.core.ktx.dateFormat import com.topjohnwu.magisk.core.model.Release import com.topjohnwu.magisk.core.model.ReleaseAssets import com.topjohnwu.magisk.core.model.UpdateInfo import retrofit2.HttpException import timber.log.Timber import java.io.IOException -import java.time.format.DateTimeFormatter class NetworkService( private val raw: RawUrl, @@ -74,7 +74,7 @@ class NetworkService( private inline fun Release.asPublicInfo(selector: (ReleaseAssets) -> Boolean): UpdateInfo { val version = tag.drop(1) - val date = createdTime.format(DateTimeFormatter.ofPattern("yyyy.M.d")) + val date = dateFormat.format(createdTime) return UpdateInfo( version = version, versionCode = versionCode,