72 lignes
2.0 KiB
Kotlin
72 lignes
2.0 KiB
Kotlin
package eu.kanade.tachiyomi.util.storage
|
|
|
|
import android.content.Context
|
|
import android.net.Uri
|
|
import android.os.Build
|
|
import androidx.core.content.FileProvider
|
|
import androidx.core.net.toUri
|
|
import eu.kanade.tachiyomi.BuildConfig
|
|
import java.io.File
|
|
|
|
val Context.cacheImageDir: File
|
|
get() = File(cacheDir, "shared_image")
|
|
|
|
/**
|
|
* Returns the uri of a file
|
|
*
|
|
* @param context context of application
|
|
*/
|
|
fun File.getUriCompat(context: Context): Uri {
|
|
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
|
FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", this)
|
|
} else {
|
|
this.toUri()
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Copies this file to the given [target] file while marking the file as read-only.
|
|
*
|
|
* @see File.copyTo
|
|
*/
|
|
fun File.copyAndSetReadOnlyTo(target: File, overwrite: Boolean = false, bufferSize: Int = DEFAULT_BUFFER_SIZE): File {
|
|
if (!this.exists()) {
|
|
throw NoSuchFileException(file = this, reason = "The source file doesn't exist.")
|
|
}
|
|
|
|
if (target.exists()) {
|
|
if (!overwrite) {
|
|
throw FileAlreadyExistsException(
|
|
file = this,
|
|
other = target,
|
|
reason = "The destination file already exists.",
|
|
)
|
|
} else if (!target.delete()) {
|
|
throw FileAlreadyExistsException(
|
|
file = this,
|
|
other = target,
|
|
reason = "Tried to overwrite the destination, but failed to delete it.",
|
|
)
|
|
}
|
|
}
|
|
|
|
if (this.isDirectory) {
|
|
if (!target.mkdirs()) {
|
|
throw FileSystemException(file = this, other = target, reason = "Failed to create target directory.")
|
|
}
|
|
} else {
|
|
target.parentFile?.mkdirs()
|
|
|
|
this.inputStream().use { input ->
|
|
target.outputStream().use { output ->
|
|
// Set read-only
|
|
target.setReadOnly()
|
|
|
|
input.copyTo(output, bufferSize)
|
|
}
|
|
}
|
|
}
|
|
|
|
return target
|
|
}
|