37 lines
1.2 KiB
Kotlin
37 lines
1.2 KiB
Kotlin
|
import java.net.http.HttpClient
|
||
|
import kotlinx.coroutines.flow
|
||
|
|
||
|
sealed class DownloadStatus {
|
||
|
|
||
|
object Success : DownloadStatus()
|
||
|
|
||
|
data class Error(val message: String) : DownloadStatus()
|
||
|
|
||
|
data class Progress(val progress: Int): DownloadStatus()
|
||
|
|
||
|
}
|
||
|
|
||
|
// function from https://gist.githubusercontent.com/SG-K/63e379efcc3d1cd3ce4fb56ee0e29c42/raw/cd9a4a016401b7c54ec01303415b5871ffa26066/downloadFile.kt
|
||
|
suspend fun HttpClient.downloadFile(file: File, url: String): Flow<DownloadStatus> {
|
||
|
return flow {
|
||
|
val response = call {
|
||
|
url(url)
|
||
|
method = HttpMethod.Get
|
||
|
}.response
|
||
|
val byteArray = ByteArray(response.contentLength()!!.toInt())
|
||
|
var offset = 0
|
||
|
do {
|
||
|
val currentRead = response.content.readAvailable(byteArray, offset, byteArray.size)
|
||
|
offset += currentRead
|
||
|
val progress = (offset * 100f / byteArray.size).roundToInt()
|
||
|
emit(DownloadStatus.Progress(progress))
|
||
|
} while (currentRead > 0)
|
||
|
response.close()
|
||
|
if (response.status.isSuccess()) {
|
||
|
file.writeBytes(byteArray)
|
||
|
emit(DownloadStatus.Success)
|
||
|
} else {
|
||
|
emit(DownloadStatus.Error("File not downloaded"))
|
||
|
}
|
||
|
}
|
||
|
}
|