Added option to intercept progress while copying files

This commit is contained in:
Viktor De Pasquale 2019-07-09 20:00:57 +02:00 committed by John Wu
parent 736729f5ef
commit 724893879f
2 changed files with 30 additions and 7 deletions

View File

@ -12,7 +12,7 @@ import com.topjohnwu.magisk.model.entity.HideTarget
import com.topjohnwu.magisk.utils.Utils import com.topjohnwu.magisk.utils.Utils
import com.topjohnwu.magisk.utils.inject import com.topjohnwu.magisk.utils.inject
import com.topjohnwu.magisk.utils.toSingle import com.topjohnwu.magisk.utils.toSingle
import com.topjohnwu.magisk.utils.writeToFile import com.topjohnwu.magisk.utils.writeToCachedFile
import com.topjohnwu.superuser.Shell import com.topjohnwu.superuser.Shell
import io.reactivex.Single import io.reactivex.Single
@ -24,21 +24,21 @@ class MagiskRepository(
fun fetchMagisk() = fetchUpdate() fun fetchMagisk() = fetchUpdate()
.flatMap { apiRaw.fetchFile(it.magisk.link) } .flatMap { apiRaw.fetchFile(it.magisk.link) }
.map { it.writeToFile(context, FILE_MAGISK_ZIP) } .map { it.writeToCachedFile(context, FILE_MAGISK_ZIP) }
fun fetchManager() = fetchUpdate() fun fetchManager() = fetchUpdate()
.flatMap { apiRaw.fetchFile(it.app.link) } .flatMap { apiRaw.fetchFile(it.app.link) }
.map { it.writeToFile(context, FILE_MAGISK_APK) } .map { it.writeToCachedFile(context, FILE_MAGISK_APK) }
fun fetchUninstaller() = fetchUpdate() fun fetchUninstaller() = fetchUpdate()
.flatMap { apiRaw.fetchFile(it.uninstaller.link) } .flatMap { apiRaw.fetchFile(it.uninstaller.link) }
.map { it.writeToFile(context, FILE_UNINSTALLER_ZIP) } .map { it.writeToCachedFile(context, FILE_UNINSTALLER_ZIP) }
fun fetchSafetynet() = apiRaw.fetchSafetynet() fun fetchSafetynet() = apiRaw.fetchSafetynet()
fun fetchBootctl() = apiRaw fun fetchBootctl() = apiRaw
.fetchBootctl() .fetchBootctl()
.map { it.writeToFile(context, FILE_BOOTCTL_SH) } .map { it.writeToCachedFile(context, FILE_BOOTCTL_SH) }
fun fetchUpdate() = when (Config.updateChannel) { fun fetchUpdate() = when (Config.updateChannel) {

View File

@ -3,13 +3,36 @@ package com.topjohnwu.magisk.utils
import android.content.Context import android.content.Context
import okhttp3.ResponseBody import okhttp3.ResponseBody
import java.io.File import java.io.File
import java.io.InputStream
import java.io.OutputStream
fun ResponseBody.writeToFile(context: Context, fileName: String): File { inline fun ResponseBody.writeToCachedFile(
context: Context,
fileName: String,
progress: (Long) -> Unit = {}
): File {
val file = File(context.cacheDir, fileName) val file = File(context.cacheDir, fileName)
withStreams(byteStream(), file.outputStream()) { inStream, outStream -> withStreams(byteStream(), file.outputStream()) { inStream, outStream ->
inStream.copyTo(outStream) inStream.copyToWithProgress(outStream, progress)
} }
return file return file
} }
fun ResponseBody.writeToString() = string() fun ResponseBody.writeToString() = string()
inline fun InputStream.copyToWithProgress(
out: OutputStream,
progressEmitter: (Long) -> Unit,
bufferSize: Int = DEFAULT_BUFFER_SIZE
): Long {
var bytesCopied: Long = 0
val buffer = ByteArray(bufferSize)
var bytes = read(buffer)
while (bytes >= 0) {
out.write(buffer, 0, bytes)
bytesCopied += bytes
bytes = read(buffer)
progressEmitter(bytesCopied)
}
return bytesCopied
}