SubwayTooter-Android-App/app/src/main/java/jp/juggler/subwaytooter/util/InputStreamOpener.kt

90 lines
2.7 KiB
Kotlin

package jp.juggler.subwaytooter.util
import android.content.ContentResolver
import android.net.Uri
import jp.juggler.util.data.getStreamSize
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.RequestBody
import okio.BufferedSink
import java.io.File
import java.io.FileInputStream
import java.io.IOException
import java.io.InputStream
// contentLengthの測定などで複数回オープンする必要がある
abstract class InputStreamOpener {
abstract val mimeType: String
abstract val isImage: Boolean
open val fixExt :String? = null
@Throws(IOException::class)
abstract fun open(): InputStream
abstract fun deleteTempFile()
val contentLength by lazy { getStreamSize(true, open()) }
// okhttpのRequestBodyにする
fun toRequestBody(onWrote: (percent: Int) -> Unit = {}) =
object : RequestBody() {
override fun contentType() = mimeType.toMediaType()
@Throws(IOException::class)
override fun contentLength(): Long = contentLength
@Throws(IOException::class)
override fun writeTo(sink: BufferedSink) {
val length = contentLength.toFloat()
open().use { inStream ->
val tmp = ByteArray(4096)
var nWrite = 0L
while (true) {
val delta = inStream.read(tmp, 0, tmp.size)
if (delta <= 0) break
sink.write(tmp, 0, delta)
nWrite += delta
val percent = (100f * nWrite.toFloat() / length).toInt()
onWrote(percent)
}
}
}
}
}
// contentResolver.openInputStream を使うOpener
fun contentUriOpener(
contentResolver: ContentResolver,
uri: Uri,
mimeType: String,
isImage: Boolean,
) = object : InputStreamOpener() {
override val mimeType = mimeType
override val isImage = isImage
@Throws(IOException::class)
override fun open(): InputStream {
return contentResolver.openInputStream(uri)
?: error("openInputStream returns null")
}
override fun deleteTempFile() = Unit
}
// 一時ファイルを使うOpener
fun tempFileOpener(
file: File,
mimeType: String,
isImage: Boolean,
fixExt:String? = null,
) = object : InputStreamOpener() {
override val mimeType = mimeType
override val isImage = isImage
override val fixExt = fixExt
@Throws(IOException::class)
override fun open() = FileInputStream(file)
override fun deleteTempFile() {
file.delete()
}
}