diff --git a/feature/trip-planner/network/src/androidMain/kotlin/xyz/ksharma/krail/trip/planner/network/api/service/HttpClient.kt b/feature/trip-planner/network/src/androidMain/kotlin/xyz/ksharma/krail/trip/planner/network/api/service/HttpClient.kt index c2296f00..7f339bc7 100644 --- a/feature/trip-planner/network/src/androidMain/kotlin/xyz/ksharma/krail/trip/planner/network/api/service/HttpClient.kt +++ b/feature/trip-planner/network/src/androidMain/kotlin/xyz/ksharma/krail/trip/planner/network/api/service/HttpClient.kt @@ -18,6 +18,7 @@ actual fun httpClient(appInfoProvider: AppInfoProvider): HttpClient { expectSuccess = true install(ContentNegotiation) { json(Json { + ignoreUnknownKeys = true isLenient = true prettyPrint = true diff --git a/feature/trip-planner/network/src/iosMain/kotlin/xyz/ksharma/krail/trip/planner/network/api/service/HttpClient.kt b/feature/trip-planner/network/src/iosMain/kotlin/xyz/ksharma/krail/trip/planner/network/api/service/HttpClient.kt index fec0e1c7..323d6908 100644 --- a/feature/trip-planner/network/src/iosMain/kotlin/xyz/ksharma/krail/trip/planner/network/api/service/HttpClient.kt +++ b/feature/trip-planner/network/src/iosMain/kotlin/xyz/ksharma/krail/trip/planner/network/api/service/HttpClient.kt @@ -28,7 +28,7 @@ actual fun httpClient(appInfoProvider: AppInfoProvider): HttpClient { level = LogLevel.BODY logger = object : Logger { override fun log(message: String) { - println(message) + // println(message) } } sanitizeHeader { header -> header == HttpHeaders.Authorization } diff --git a/gtfs-static/src/androidMain/kotlin/xyz/ksharma/krail/gtfs_static/FileStorage.android.kt b/gtfs-static/src/androidMain/kotlin/xyz/ksharma/krail/gtfs_static/FileStorage.android.kt index 41944747..28e026f8 100644 --- a/gtfs-static/src/androidMain/kotlin/xyz/ksharma/krail/gtfs_static/FileStorage.android.kt +++ b/gtfs-static/src/androidMain/kotlin/xyz/ksharma/krail/gtfs_static/FileStorage.android.kt @@ -3,22 +3,26 @@ package xyz.ksharma.krail.gtfs_static import android.content.Context import dev.gitlive.firebase.Firebase import dev.gitlive.firebase.crashlytics.crashlytics +import okio.FileSystem +import okio.Path +import okio.Path.Companion.toOkioPath +import okio.buffer import xyz.ksharma.krail.core.log.log -import java.io.File class AndroidFileStorage(private val context: Context) : FileStorage { - override suspend fun saveFile(fileName: String, data: ByteArray) { - runCatching { + + private val fileSystem = FileSystem.SYSTEM + + override suspend fun saveFile(fileName: String, data: ByteArray): Path { + return runCatching { println("Try Saving file: $fileName") - val file = File(context.filesDir, fileName) - file.writeBytes(data) - println("File saved at: ${file.absolutePath}") - readZip(file.absolutePath) + val filePath: Path = context.filesDir.toPath().resolve(fileName).toOkioPath() + fileSystem.sink(filePath).buffer().use { it.write(data) } + println("File saved at: $filePath") + filePath }.onFailure { log("Failed to save file: $it") Firebase.crashlytics.recordException(it) - }.onSuccess { - log("File saved at: ${context.filesDir.absolutePath}") - } + }.getOrThrow() } } diff --git a/gtfs-static/src/commonMain/kotlin/xyz/ksharma/krail/gtfs_static/FileStorage.kt b/gtfs-static/src/commonMain/kotlin/xyz/ksharma/krail/gtfs_static/FileStorage.kt index 8571ea65..7884a701 100644 --- a/gtfs-static/src/commonMain/kotlin/xyz/ksharma/krail/gtfs_static/FileStorage.kt +++ b/gtfs-static/src/commonMain/kotlin/xyz/ksharma/krail/gtfs_static/FileStorage.kt @@ -1,5 +1,16 @@ package xyz.ksharma.krail.gtfs_static +import okio.Path + interface FileStorage { - suspend fun saveFile(fileName: String, data: ByteArray) + + /** + * Save a file with the given name and data + * + * @param fileName the name of the file to save + * @param data the data to save + * + * @return the path where the file was saved + */ + suspend fun saveFile(fileName: String, data: ByteArray) : Path } diff --git a/gtfs-static/src/commonMain/kotlin/xyz/ksharma/krail/gtfs_static/RealNswGtfsService.kt b/gtfs-static/src/commonMain/kotlin/xyz/ksharma/krail/gtfs_static/RealNswGtfsService.kt index 5ff79be8..a397ff69 100644 --- a/gtfs-static/src/commonMain/kotlin/xyz/ksharma/krail/gtfs_static/RealNswGtfsService.kt +++ b/gtfs-static/src/commonMain/kotlin/xyz/ksharma/krail/gtfs_static/RealNswGtfsService.kt @@ -6,6 +6,7 @@ import io.ktor.client.statement.HttpResponse import io.ktor.client.statement.readRawBytes import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.withContext +import okio.Path import xyz.ksharma.krail.core.di.DispatchersComponent import xyz.ksharma.krail.core.log.log @@ -22,7 +23,8 @@ internal class RealNswGtfsService( if (response.status.value == 200) { log("Downloading file: ") val data = response.readRawBytes() - fileStorage.saveFile("sydneytrains.zip", data) + val path: Path = fileStorage.saveFile("sydneytrains.zip", data) + readZip(path) log("File downloaded") } else { throw Exception("Failed to download file: ${response.status}") diff --git a/gtfs-static/src/commonMain/kotlin/xyz/ksharma/krail/gtfs_static/ZipManager.kt b/gtfs-static/src/commonMain/kotlin/xyz/ksharma/krail/gtfs_static/ZipManager.kt index 5622e676..9e3d5c50 100644 --- a/gtfs-static/src/commonMain/kotlin/xyz/ksharma/krail/gtfs_static/ZipManager.kt +++ b/gtfs-static/src/commonMain/kotlin/xyz/ksharma/krail/gtfs_static/ZipManager.kt @@ -7,19 +7,18 @@ import okio.openZip import okio.use import xyz.ksharma.krail.core.log.log -fun readZip(zipPath: String) { +fun readZip(zipPath: Path) { println("Reading Zip: $zipPath") // Use the same directory as the zip file for unpacking - val zipFilePath = zipPath.toPath() - val parentDir = zipFilePath.parent ?: throw IllegalArgumentException("Invalid path: $zipPath") + val parentDir = zipPath.parent ?: throw IllegalArgumentException("Invalid path: $zipPath") val destDir = parentDir.resolve("sydneyTrains") // Create the "bus" directory fileSystem.createDirectories(destDir) // Unpack the zip into the "bus" directory - unpackZip(zipFilePath, destDir) + unpackZip(zipPath, destDir) } fun unpackZip(zipFile: Path, destDir: Path) { diff --git a/gtfs-static/src/iosMain/kotlin/xyz/ksharma/krail/gtfs_static/FileStorage.ios.kt b/gtfs-static/src/iosMain/kotlin/xyz/ksharma/krail/gtfs_static/FileStorage.ios.kt index c9caad27..ab8d38aa 100644 --- a/gtfs-static/src/iosMain/kotlin/xyz/ksharma/krail/gtfs_static/FileStorage.ios.kt +++ b/gtfs-static/src/iosMain/kotlin/xyz/ksharma/krail/gtfs_static/FileStorage.ios.kt @@ -5,6 +5,8 @@ import dev.gitlive.firebase.crashlytics.crashlytics import kotlinx.cinterop.ExperimentalForeignApi import kotlinx.cinterop.addressOf import kotlinx.cinterop.usePinned +import okio.Path +import okio.Path.Companion.toPath import platform.Foundation.NSData import platform.Foundation.NSDocumentDirectory import platform.Foundation.NSFileManager @@ -14,10 +16,11 @@ import platform.Foundation.writeToFile import xyz.ksharma.krail.core.log.log class IosFileStorage : FileStorage { + @OptIn(ExperimentalForeignApi::class) - override suspend fun saveFile(fileName: String, data: ByteArray) { + override suspend fun saveFile(fileName: String, data: ByteArray): Path { log("Trying to Save file: $fileName") - runCatching { + return runCatching { val fileManager = NSFileManager.defaultManager val directory = fileManager.URLForDirectory( directory = NSDocumentDirectory, @@ -33,11 +36,10 @@ class IosFileStorage : FileStorage { .writeToFile(filePath, true) } log("File saved: $filePath") + filePath.toPath() }.onFailure { log("Failed to save file: $it") Firebase.crashlytics.recordException(it) // todo - move to another module - }.onSuccess { - log("File saved successfully") - } + }.getOrThrow() } }