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 { 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")) } } }